首页 > 编程语言 >算法刷题 Day 32 | ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

算法刷题 Day 32 | ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

时间:2023-02-07 22:02:28浏览次数:60  
标签:游戏 int cover E6% II prices 跳跃 覆盖范围

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

本题解法很巧妙,大家可以看题思考一下,在看题解。

https://programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII.html

Tips:这道题解是自己想出来的,整体思路就是如果下一天股价变低了就在上一天抛掉。然后记得最后一天要单独处理,免得没有卖掉持仓。

我的题解:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int cost = prices[0];
        int profit = 0;
        for(int i = 1; i< prices.size();i++){
            if(prices[i] < prices[i-1]){
                profit += prices[i - 1] - cost;
                cost = prices[i];
            }
            else if( i == prices.size() - 1){
                profit += prices[i] - cost;
            }
        }
        return profit;
    }
};

55.跳跃游戏

本题如果没接触过,很难想到,所以不要自己憋时间太久,读题思考一会,没思路立刻看题解

https://programmercarl.com/0055.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8F.html

Tips:

其实跳几步无所谓,关键在于可跳的覆盖范围!

不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。

这个范围内,别管是怎么跳的,反正一定可以跳过来。

那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!

每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。

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

局部最优推出全局最优,找不出反例,试试贪心!

如图:

55.跳跃游戏

i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。

而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。

如果cover大于等于了终点下标,直接return true就可以了。

我的题解:

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

45.跳跃游戏II

本题同样不容易想出来。贪心就是这样,有的时候 会感觉简单到离谱,有时候,难的不行,主要是不容易想到。

https://programmercarl.com/0045.%E8%B7%B3%E8%B7%83%E6%B8%B8%E6%88%8FII.html

Tips:

真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!

这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖

如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。

我的题解:

class Solution {
public:
    int jump(vector<int>& nums) {
        if(nums.size() == 1){
            return 0;
        }
        int count = 0;
        int curDistance = 0;
        int nextDistance = 0;
        // 如果到了终点自然就跳出循环了
        for(int i = 0; i<nums.size();i++){
            //一直更新下一步的范围
            nextDistance = max(nextDistance, i + nums[i]);
            if(i == curDistance){
                // 如果还没到终点的话,就走一步
                if(i < nums.size() - 1){
                    count++;
                    curDistance = nextDistance;
                }
                else break;
            }
        }
        return count;
    }
};

 

标签:游戏,int,cover,E6%,II,prices,跳跃,覆盖范围
From: https://www.cnblogs.com/GavinGYM/p/17099944.html

相关文章