代码随想录算法训练营第三十一天|LeetCode122. 买卖股票的最佳时机 II、LeetCode55. 跳跃游戏、LeetCode45. 跳跃游戏 II

一LeetCode122. 买卖股票的最佳时机 II

题目链接:122. 买卖股票的最佳时机 II
这道题还是比较简单的。
题目给出某只股票连续天的价格,且可以在同一天购买和抛售。
那么要求最大的利润只需要比较相邻的价格,后面的价格比前面的价格高就有利润,只需依次加上可得利润的相邻股票价格之差就可以了(后面减去前面需是正数)。
代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int sum = 0;
        for(int i = 0; i < prices.size() - 1; i++) {
            if(prices[i] < prices[i + 1]) sum += (prices[i + 1] - prices[i]);//如果后一天价格高于前一天就有利润。
        }
        return sum;

    }
};

二、LeetCode55. 跳跃游戏

题目链接:55. 跳跃游戏
通过遍历数组来寻找每次跳跃所能覆盖的最大下标范围。
首先覆盖的是下标0,然后根据下标0的数值,更新跳跃能够覆盖的最大下标(如果最大下标大于等于数组的最大下标,说明是可以跳跃到数组最后一个下标的),然后依次向右遍历到最大下标(当然每遍历一个数值,都要进行更新覆盖到的最大下标)。
代码如下:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cov = 0;//寻找覆盖的最大范围
        for(int i = 0; i <= cov; i++) {
            cov = cov > i + nums[i] ? cov : i + nums[i];//每次更新覆盖范围的最大值
            if(cov >= nums.size() - 1) return true;//如果最大能覆盖完整个数组,说明可以跳到最后一个下标
        }
        return false;
    }
};

三、LeetCode45. 跳跃游戏 II

题目链接:45. 跳跃游戏 II
这道题还是比较难的。
需要记录当前步数和下一步所能覆盖的最大范围。
同时实时更新下一步的覆盖范围,当走到当前步数的最大范围时要让步数加一,还要更新当前的步数最大覆盖范围。
代码如下:

class Solution {
public:
    int jump(vector<int>& nums) {
        int ans = 0;//记录跳跃步数
        int curdistance = 0;//记录当前步数下覆盖到的最大范围
        int nextdistance = 0;//记录下一步覆盖到的最大范围
        for(int i = 0; i < nums.size() - 1; i++) {
            nextdistance = max(i + nums[i], nextdistance);//更新下一步的最大范围
            if(i == curdistance) {//如果走到当前步数的最大范围,步数加一,更新当前步数覆盖到的最大范围
                ans++;
                curdistance = nextdistance;
            }
        }
        return ans;

    }
};

总结

贪心的算法确实比较困难。

你可能感兴趣的:(C++算法题解,算法,游戏,leetcode)