跳跃游戏||
本文最后更新于516 天前,其中的信息可能已经过时,如有错误请发送邮件到1986413837@qq.com

这个题我一开始想到的就是动态规划,但其实发现这个方法不是优法,因为用到了两层循环,时间复杂度大.

但是确实这题确实有动态规划的思想 代码贴在这里

class Solution {
public:
    int jump(vector& nums) {
        vector dp(nums.size(), INT_MAX);
        dp[0] = 0;

//dp[i]表示从初始位置到第i个位置的最少跳跃次数

        for (int i = 0; i < nums.size(); i++) {
            for (int j = 1; j <= nums[i]; j++) {
                if (i + j < nums.size()) {
                    dp[i + j] = min(dp[i + j], dp[i] + 1);
                }
            }
        }
        return dp[nums.size() – 1];
    }
    };

这题的另一个方法更直观 可以使用贪心策略:

每次找到可到达的最远位置,就可以在线性时间内得到最少的跳跃次数

例如,对于数组 [2,3,1,2,4,2,3],初始位置是下标 0,从下标 0 出发,最远可到达下标 2。下标 0 可到达的位置中,下标 1 的值是 3,从下标 1 出发可以达到更远的位置,因此第一步到达下标 1。

从下标 1 出发,最远可到达下标 4。下标 1 可到达的位置中,下标 4 的值是 4 ,从下标 4 出发可以达到更远的位置,因此第二步到达下标 4。

class Solution {
public:
int jump(std::vector& nums) {
int jumps = 0, currentEnd = 0, farthest = 0;

    for (int i = 0; i < nums.size() - 1; i++) {
        // 更新能达到的最远距离
        farthest = std::max(farthest, i + nums[i]);

        // 如果我们到了当前跳跃的边界,就增加跳跃次数
        if (i == currentEnd) {
            jumps++;
            currentEnd = farthest;  // 更新当前边界
        }
    }

    return jumps;
}

};

Life's a struggle, I'll conquer it.
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇