zoukankan      html  css  js  c++  java
  • Leetcode 045. 跳跃游戏 II 贪心

    地址 https://leetcode-cn.com/problems/jump-game-ii/

    给定一个非负整数数组,你最初位于数组的第一个位置。
    
    数组中的每个元素代表你在该位置可以跳跃的最大长度。
    
    你的目标是使用最少的跳跃次数到达数组的最后一个位置。
    
    示例:
    
    输入: [2,3,1,1,4]
    输出: 2
    解释: 跳到最后一个位置的最小跳跃数是 2。
         从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

    解答

    由于题目要求是可以跳跃的最大长度而不是必须要跳的长度

    那么 num[i]+i 是能达到的最远元素索引 那么他就可以包含其他选择所能达到的位置 

    所以我们使用贪心策略  每次选择 nums[i]+i 能达到最远的索引即可

    道理很清晰 但是代码考虑到边界问题后 组织起来还是有一番难度的

    class Solution {
    public:
        
        int jump(vector<int>& nums) {
        if (nums.size() == 1) return 0;
        int maxpos = 0;
        int step = 1;
        while (maxpos < nums.size() - 1) {
            if (nums[maxpos] + maxpos >= nums.size() - 1) 
                return step;
            int maxr = -1; int maxidx = -1;
            for (int i = 1; i <= nums[maxpos]; i++) {
                int idx = maxpos + i;
    
                if (maxr < nums[idx] + idx) {
                    maxr = nums[idx] + idx;
                    maxidx = idx;
                }
            }
            maxpos = maxidx;
            step++;
        }
    
        return step;
    }
        
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    CF 7C. Line(扩展欧几里德)
    HDU 1700 Points on Cycle(向量旋转)
    POJ 1673 EXOCENTER OF A TRIANGLE(垂心)
    SRM 594 DIV1 250
    Codeforces Round #207 (Div. 1) A. Knight Tournament(STL)
    POJ 1654 Area(水题)
    POJ 1474 Video Surveillance(半平面交)
    POJ 1473 There's Treasure Everywhere!
    POJ 1329 Circle Through Three Points(三角形外心)
    POJ 1279 Art Gallery(半平面交)
  • 原文地址:https://www.cnblogs.com/itdef/p/12826783.html
Copyright © 2011-2022 走看看