参考:
部分参考 http://blog.csdn.net/luke2834/article/details/53044967,鸣谢。
题目链接:
https://leetcode.com/problems/jump-game-ii/
题目大意:
给定一维数组a[n],a[i]表示从i个位置出发向后能跳的最远距离。现在从0出发,问跳到n-1需要的最少步数是多少。
解题思路:
1.朴素dp:
令dp[i]表示跳到第i个位置所需要的最少步数。则dp[i] = min(dp[j] + 1), if j + a[j] >= i。复杂度O(n2),会超时。
2.BFS:
将原问题转化为对偶问题思考,使用BFS求第i步能到达的最远位置。复杂度O(n)。
代码:
1.朴素dp:
1 class Solution 2 { 3 public: 4 int min(int a, int b) 5 { 6 return a < b ? a : b; 7 } 8 int jump(vector<int>& nums) 9 { 10 int n = nums.size(); 11 vector<int> dp(n, 0x3f3f3f3f); 12 dp[0] = 0; 13 for (int i = 1; i < n; i++) 14 { 15 for (int j = 0; j < i; j++) 16 { 17 if (j + nums[j] >= i) 18 { 19 dp[i] = min(dp[i], dp[j] + 1); 20 } 21 } 22 } 23 return dp[n - 1]; 24 } 25 };
2.BFS:
1 class Solution 2 { 3 public: 4 int max(int a, int b) 5 { 6 return a > b ? a : b; 7 } 8 int jump(vector<int>& nums) 9 { 10 int n = nums.size(); 11 if (n < 2) 12 return 0; 13 int depth = 0, curMax = 0, nextMax = 0; 14 while (curMax >= depth) 15 { 16 for (int i = depth; i <= curMax; i++) 17 { 18 nextMax = max(nextMax, nums[i] + i); 19 if (nextMax >= n - 1) 20 return depth + 1; 21 } 22 depth++; 23 curMax = nextMax; 24 } 25 return -1; 26 } 27 };