当前位置: 首页 > 知识库问答 >
问题:

为什么对于这个Leetcode问题(单词搜索),我的第一个解决方案比第二个解决方案运行得慢?

祁霖
2023-03-14

以下是对不熟悉此问题的人的问题声明:

给定一个二维板和一个单词,找出这个单词是否存在于网格中。这个词可以由顺序相邻单元格的字母构成,其中“相邻”单元格是那些水平或垂直相邻的单元格。同一个字母单元格不能使用不止一次。

public boolean exist(char[][] board, String word) {
        if (word == null || word.length() == 0) return true;
        if (board == null || board.length == 0 || board[0] == null) return false;
        if (word.length() > board.length * board[0].length) return false;
        char[] w = word.toCharArray();
        char a = w[0];
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j] == a && DFS(board,w,i,j,0)) return true;
            }
        }
        return false;
    }
public boolean DFS(char[][] board, char[] word, int i, int j, int idx) {
        if (idx == word.length) return true;
        if (i < 0 || i >= board.length || j < 0 || j >= board[0].length ||
           board[i][j] != word[idx]) return false;
        board[i][j] = '@';
        int[][] dirs = {{-1,0},{1,0},{0,-1},{0,1}};
        for (int[] d : dirs) {
            if (DFS(board,word,i+d[0],j+d[1],idx+1)) return true;
        }
        board[i][j] = word[idx];
        return false;
    }

解决方案2

public boolean DFS(char[][] board, char[] word, int i, int j, int idx) {
        if (idx == word.length) return true;
        if (i < 0 || i >= board.length || j < 0 || j >= board[0].length ||
           board[i][j] != word[idx]) return false;
        board[i][j] = '@';
        boolean found = false;
        found = DFS(board,word,i-1,j,idx+1) || DFS(board,word,i+1,j,idx+1) ||
            DFS(board,word,i,j-1,idx+1) || DFS(board,word,i,j+1,idx+1);
        board[i][j] = word[idx];
        return found;
    }

现在,据我所知,随着Java的短路,dfs()的两个版本都应该停止探索其他路径,如果任何子问题返回true。事实上,我可以评估的两个版本之间唯一的操作差异是,如果找到解决方案,第一个版本不需要重置董事会(没有@字符指示访问位置的原始形式),而第二个版本需要重置董事会。

所以根据我的理解,如果有的话,第二个解决方案应该比第一个慢。但很明显,我错了:解决方案一运行8毫秒,而解决方案二运行3毫秒。

共有1个答案

蒋高扬
2023-03-14

jit编译器比你聪明。第二个版本的内联代码更简单(4个版本),而不是1个,它可以反编译并重新编译几次。我猜。

 类似资料:
  • 这是一个骇人听闻的问题:爱丽丝是一个幼儿园老师。她想给班上的孩子们一些糖果。所有的孩子坐成一行(他们的位置是固定的),每个人根据他(她)在班上的表现有一个评级分数。爱丽丝想给每个孩子至少一颗糖。如果两个孩子挨着坐,那么评分较高的那一个必须得到更多的糖果。爱丽丝想省钱,所以她需要尽量减少给孩子们的糖果总数。 测试数组:n=10,n个元素为[2 4 2 6 1 7 8 9 2 1]。我得到的答案是18

  • 对于python我是新手,我正在做leetcode问题94,二叉树顺序遍历。给定二叉树的根,返回对其节点值的inorder遍历。 但我还是不明白它为什么有用。在之后,在递归过程中,res变量不会被重新分配给[]吗?或者res变量在不同的递归中应该是不同的变量吗?

  • 当我们基本完成程序的设计,我们就可以编写代码了,它是对我们的解决方案的实施。 版本一 例10.1 备份脚本——版本一 #!/usr/bin/python # Filename: backup_ver1.py importos importtime # 1. The files and directories to be backed up are specified in a list. sour

  • 给定一个二维板和一个单词,找出这个单词是否存在于网格中。 这个词可以由顺序相邻单元格的字母构成,其中“相邻”单元格是那些水平或垂直相邻的单元格。同一个字母单元格不能使用不止一次。 例如,给定 这是典型的DFS+回溯解决方案。它将与进行比较。如果它们匹配,则将更改为以将其标记为已访问。然后移动到下一个(即)并将其与当前邻居进行比较(通过递归进行)。 下面是我的代码,这是不工作。我试着调试,但我觉得在

  • 我有一个(以前排序的)文本文件,由破折号或单个字母字符组成。我将非常感谢任何帮助,以更好地理解适当的awk语法,以便在文本文件的每一列中移动,并且如果存在非破折号字符,则仅保留每行中的第一个非破折号字符,或者如果不存在字母字符,则保留该破折号字符...无论哪种情况,结果都是单行文本。文件总是以这样一种方式格式化,即每行具有相同的列数,并且总是首选第一个非破折号字符,无论“较低”行中是否存在其他字母

  • 问题内容: 包括我在内的一些人一直在努力将来自不同模块(jar)的实体合并到单个持久性单元中(尤其是 JavaSE ,例如此处的JPA 2.0:从不同的jar自动将实体类添加到PersistenceUnit中)。根据答案,没有简单直接的方法可以做到这一点。解决方案之一是在单个持久性单元文件中列出所有jar中的所有类,但这并不是很优雅。我可能不小心找到了另一种方法。通常,我所有的实体类都是使用 注释