力扣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 };

 

posted @ 2025-05-26 14:23  J&YANG  阅读(14)  评论(0)    收藏  举报