力扣45. 跳跃游戏 II
题目:【https://leetcode.cn/problems/jump-game-ii/?envType=study-plan-v2&envId=top-interview-150】
当时首先想到的是dp,也写出了一个dp算法,不过写的时候就知道,这个方法时间复杂度在最差的情况下,趋近于n的平方,肯定不是最优解,不过还是记录一下
1 class Solution { 2 public: 3 int jump(vector<int>& nums) { 4 int n = nums.size(); 5 vector<int> dp(n, 20000); 6 dp[0] = 0; 7 for (int i = 0; i < n; ++i) { 8 int tn = min(n, i + 1 + nums[i]); 9 for (int j = i + 1; j < tn; ++j) { 10 dp[j] = min(dp[i] + 1, dp[j]); 11 } 12 } 13 return dp[n - 1]; 14 } 15 };
接下来这个方法是n时间复杂度的,看了答案以后才理解的,是用一个e变量来卡本次这一步最大到哪里,到e之前,向外扩展max能达到的最大位置,到e的时候,将已经扩展的max赋值给e,也就代表着,这一步最大能到哪里了
1 class Solution { 2 public: 3 int jump(vector<int>& nums) { 4 int n = nums.size(); 5 if (1 == n) 6 return 0; 7 int m = nums[0]; 8 int e = m; 9 int ret = 0; 10 for (int i = 1; i < n - 1; ++i) { 11 if (i <= m) { 12 m = max(m, i + nums[i]); 13 if (e == i) { 14 e = m; 15 ret++; 16 } 17 } 18 } 19 return ret + 1; 20 } 21 };