代码随想录算法训练day32||122.买卖股票的最佳时机II ||55. 跳跃游戏 ||45.跳跃游戏II

122.买卖股票的最佳时机II

思路:

本题首先要清楚两点:

  • 只有一只股票!
  • 当前只有买股票或者卖股票的操作

想获得利润至少要两天为一个交易单元。

这道题目可能我们只会想,选一个低的买入,在选个高的卖,在选一个低的买入.....循环反复。

如果想到其实最终利润是可以分解的,那么本题就很容易了!

class Solution {
public:
    int maxProfit(vector& prices) {
        int result=0;
        for(int i=1;i

55. 跳跃游戏

思路:

跳跃游戏最主要的点就是想到统计每个点覆盖的最远范围,每次统计当前能够到达的点的最远距离,不断更新这个最远范围,如果这个最远范围最终>=最后一个下标的位置,那么可以到达返回true,如果统计完后这些位置的最大值小于最后一个位置返回FALSE。

这道题如果考虑的是每次应该跳几步,应该怎么跳的话,那么解出这道题将十分困难。

贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点

class Solution {
public:
    bool canJump(vector& nums) {
        //当最远覆盖范围超过最后一个下标时,表示可以跳到,而不是精确计算每次应该跳几步,而是统计每一步的
        //最大范围进行实时更新
        int cover=nums[0];
        for(int i=0;i<=cover;i++){
            cover=max(cover,i+nums[i]);
            if(cover>=nums.size()-1) return true;
        }
        return false;
    }
};

45.跳跃游戏II

题目描述:

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

  • 输入: [2,3,1,1,4]
  • 输出: 2
  • 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

说明: 假设你总是可以到达数组的最后一个位置。

思路:

这道题是上一道题的改版,但是要难一些,这题怎么解,这题依旧是需要统计覆盖的范围而不是每一步该如何去走,走一步还是走两步。这道题我们要设置两个变量,当前能够走的最大距离和下一步能够走的最大距离,从头开始遍历数组,每走一步都统计下一步能够走的最大距离,实时更新,如果当前遍历到的值等于当前这一步能够走到的最大下标,那么进入判断,统计的最大下一步是否能够到达最后一个数组下标,如果不能,curMax=nextMax,然后继续遍历curMax,一直往复直到遍历到了终点。

class Solution {
public:
    int jump(vector& nums) {
        if (nums.size() == 1) return 0;
        int curDistance = 0;    // 当前覆盖最远距离下标
        int ans = 0;            // 记录走的最大步数
        int nextDistance = 0;   // 下一步覆盖最远距离下标
        for (int i = 0; i < nums.size(); i++) {
            nextDistance = max(nums[i] + i, nextDistance);  // 更新下一步覆盖最远距离下标
            if (i == curDistance) {                         // 遇到当前覆盖最远距离下标
                if (curDistance != nums.size() - 1) {       // 如果当前覆盖最远距离下标不是终点
                    ans++;                                  // 需要走下一步
                    curDistance = nextDistance;             // 更新当前覆盖最远距离下标(相当于加油了)
                    if (nextDistance >= nums.size() - 1) break; // 下一步的覆盖范围已经可以达到终点,结束循环
                } else break;                               // 当前覆盖最远距离下标是集合终点,不用做ans++操作了,直接结束
            }
        }
        return ans;
    }
};

你可能感兴趣的:(算法,leetcode,职场和发展)