LC45 跳跃游戏
这题我是用queue写的BFS,超时了。
如果在每一层倒序遍历的话,有一个样例过不了,比答案多了1,如果用正序会超时。
我想正序遍历肯定不对,因为按照贪心的想法不对。倒序遍历,虽然是按照贪心思想,但是有可能前面的结果反而比后面的优,这种情况没办法处理。所以直接BFS不行。
因为这个含有单调性,每一个位置都可以从前面位置过来,当前的位置的最小值可以影响后面位置的最小值。可以使用单调队列优化成O(N)。
后来看了题解,其实很多时候,只想着用BFS实现什么的,但其实可以不拘泥于形式。不是所有BFS都需要queue,有可能表面看起来是数组,但其实用的BFS思想,是根据单调性优化的BFS。
因为BFS是将所有路径都遍历了一遍,其实不需要管这些路径,只要得到之前每个位置的结果就可以得到当前位置的结果。BFS貌似和动态规划也有联系。
所以按这个原理,确实只用遍历每个位置就可以得到答案。
class Solution { public: int jump(vector<int>& nums) { int N = nums.size(); vector<int> dp(N, 0); for(int i = 1, last = 0; i < N; i++) { while(last < N && last+nums[last] < i) last++; dp[i] = dp[last]+1; } return dp[N-1]; } };
如果遇到了其他的单调关系,这个做法不一定可以。因为这个顺序不能保证一定单调。
用单调队列根据具体情况处理才是通解。
官方题解这么说的,很有道理。我没有考虑到这一点。