代码训练营第35天:贪心算法part2|leetcode122买卖股票的最佳时机2|leetcode55跳跃游戏|leetcode45跳跃游戏2

leetcode122:买卖股票的最佳时机2

文章讲解:leetcode122

leetcode55:跳跃游戏

文章讲解:leetcode55

leetcode45:跳跃游戏2

文章讲解:leetcode45

目录

1,leetcode122买入股票的最佳时机:

2,leetcode55跳跃游戏

3,leetcode45 跳跃游戏2


1,leetcode122买入股票的最佳时机:

这道题容易想到贪心思路,只要所有正收益相加就是最大的收益。

class Solution {
public:
    int maxProfit(vector& prices) {
        int result = 0;
        for(int i = 0;i=0){
                result = result+prices[i+1]-prices[i];
            }
        }
        return result;
    }
};

2,leetcode55跳跃游戏

这道题的贪心思路也不复杂,从第一个点出发,遍历能到达的所有点,找到这些点中能到最远未知的点作为下一次遍历的起点,最终如果超过了数组长度就能到达,没超过就不能到。

class Solution {
public:
    bool canJump(vector& nums) {
        int range = nums[0];
        for(int i = 0;i<=range;i++){
            range = max(range, i+nums[i]);
            if (range >= nums.size() - 1) return true;
        }
        return false;
    }
};

3,leetcode45 跳跃游戏2

这道题我开始想的是,55题每次找最远就是最优的思路,只要统计次数就行,后来发现不对,例如

2,3,1

一步就可以了,但是按照上面那道题则需要两步。

就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。

这个思路没见过,确实第一时间难以想到。

class Solution {
public:
    int jump(vector& nums) {
        int curDistance = 0;    // 当前覆盖的最远距离下标
        int ans = 0;            // 记录走的最大步数
        int nextDistance = 0;   // 下一步覆盖的最远距离下标
        for (int i = 0; i < nums.size() - 1; i++) { // 注意这里是小于nums.size() - 1,这是关键所在
            nextDistance = max(nums[i] + i, nextDistance); // 更新下一步覆盖的最远距离下标
            if (i == curDistance) {                 // 遇到当前覆盖的最远距离下标
                curDistance = nextDistance;         // 更新当前覆盖的最远距离下标
                ans++;
            }
        }
        return ans;
    }
};

注意那个循环终止条件

因为当移动下标指向 nums.size - 2 时:

  • 如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即 ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图: 

    代码训练营第35天:贪心算法part2|leetcode122买卖股票的最佳时机2|leetcode55跳跃游戏|leetcode45跳跃游戏2_第1张图片

  • 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图:

代码训练营第35天:贪心算法part2|leetcode122买卖股票的最佳时机2|leetcode55跳跃游戏|leetcode45跳跃游戏2_第2张图片

你可能感兴趣的:(算法,leetcode)