代码编织梦想

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

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

解:
如果想到其实最终利润是可以分解的,那么本题就很容易了!
如何分解呢?
假如第0天买入,第3天卖出,那么利润为:prices[3] - prices[0]。
相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。
此时就是把利润分解为每天为单位的维度,而不是从0天到第3天整体去考虑!
那么根据prices可以得到每天的利润序列:(prices[i] - prices[i - 1])…(prices[1] - prices[0])。

从图中可以发现,其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。
那么只收集正利润就是贪心所贪的地方!
局部最优:收集每天的正利润,全局最优:求得最大利润。

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

55. 跳跃游戏

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。

解:

//贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cover=0;
        if(nums.size()==1) return true;
        for(int i=0;i<=cover;i++)
        {
            cover=max(i+nums[i],cover);
            if(cover>=nums.size()-1) return true;
        }
        return false;
    }
};

45. 跳跃游戏 II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

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

简单递归法:

class Solution {
public:
    int number=0;
    int jump(vector<int>& nums) {
        if(nums.size()==1) return 0;
        if(nums[0]>=nums.size()-1) return ++number;
        for(int i=1;i<nums.size()-1;i++)
        {
            if(nums[i]>=nums.size()-1-i)
            {   
                number++;
                vector<int> subnum{&nums[0],&nums[0]+i+1}; //分割数组
                jump(subnum);
                break;
            }
        }
        return number;
    }
};

贪心法:
从图中可以看出来,就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。
这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时
如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。
C++代码如下:(详细注释)
// 版本一

class Solution {
public:
    int jump(vector<int>& 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;
    }
};
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44132116/article/details/128842069

day 32 | 122.买卖股票的最佳时机ii & 55. 跳跃游戏 & 45. 跳跃游戏ii_tttowo的博客-爱代码爱编程

看题目感觉挺简单的,结果自己做了好久好久没做出来。。。。。。   看了代码随想录之后才知道思路呜呜呜  我就是没想到利润是可以分解的。。。。。。。。。。。。。。知道这点代码写起来很容易 public int maxProfit(int[] prices) { if(prices.length==1){ret

代码随想录day32|122.买卖股票的最佳时机ii|55. 跳跃游戏|45.跳跃游戏ii|golang_扣1送肥猫的博客-爱代码爱编程

代码随想录day32 目录 代码随想录day32 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II 122.买卖股票的最佳时机II 本题首先要清楚两点: 只有一只股票!当前只有买股票或者卖股票的操作 想获得利润至少要两天为一个交易单元。 贪心算法         这道题目可能我们只会想,选一个低的买入,在选

算法训练day32 | leetcode122. 买卖股票的最佳时机;leetcode55. 跳跃游戏;leetcode45. 跳跃游戏ii_努力学习的牛宁西的博客-爱代码爱编程

目录  LeetCode122. 买卖股票的最佳时机 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考与收获 LeetCode55. 跳跃游戏 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考与收获 LeetCode45. 跳跃游戏II 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考与收获  

代码随想录 | day 32 - 122. 买卖股票的最佳时机ii、55. 跳跃游戏、45. 跳跃游戏ii_非社会人士的博客-爱代码爱编程

         今天的贪心算法题目相比昨天的容易很多,再次说明贪心算法很多时候靠感觉,严格的推导不是很有必要,应该以做出题为目的。虽然都自己AC,但后两题自己的思路和实现方法不如题解简洁。         第1题(122. 买卖股票的最佳时机II)比较简单,自己实现的贪心策略是只在第二天价格高于当天价格时,才在当天买入。所以只需要遍历pri

算法练习 day32 || 122.买卖股票的最佳时机ii 55. 跳跃游戏 45.跳跃游戏ii 55. 跳跃游戏 45.跳跃游戏ii_uafhængige的博客-爱代码爱编程

122.买卖股票的最佳时机II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易

代码随想录刷题day32 | 122.买卖股票的最佳时机ii | 55. 跳跃游戏 | 45. 跳跃游戏 ii_dum1615的博客-爱代码爱编程

代码随想录刷题Day32 | 122.买卖股票的最佳时机II | 55. 跳跃游戏 | 45. 跳跃游戏 II 122.买卖股票的最佳时机II 题目: 给你一个整数数组 prices ,其中 prices[i] 表示某

day32|122. 买卖股票的最佳时机 ii | 55. 跳跃游戏 | 45. 跳跃游戏 ii_青丹迷弟的博客-爱代码爱编程

幻觉??尽然可以很简单! 幻觉!!原来很难!!! 每天加油,防止GG 122. 买卖股票的最佳时机 II55. 跳跃游戏45. 跳跃游戏 II 122. 买卖股票的最佳时机 II 给你一个整数数组 pr

代码随想录day32|122.买卖股票的最佳时机ii、55.跳跃游戏、45.跳跃游戏ii_囿丫七的博客-爱代码爱编程

文章目录 122.买卖股票的最佳时机II55.跳跃游戏45.跳跃游戏II 122.买卖股票的最佳时机II 文章讲解:代码随想录 (programmercarl.com) 题目链接:122. 买卖股票的最佳时

代码随想录算法训练营第32天|122.买卖股票的最佳时机ii,55. 跳跃游戏,45.跳跃游戏ii_扭一扭.的博客-爱代码爱编程

122. 买卖股票的最佳时机II 力扣 思路: 1. 把利润分解为每天为单位的维度,根据prices可以得到每天的利润序列:(prices[i] - prices[i - 1]).....(prices[1] - prices[0]); 2. 局部最优:收集每天的正利润,全局最优:求得最大利润。 class Solution { publ

代码随想录算法训练营第三十二天| 122.买卖股票的最佳时机ii、55. 跳跃游戏、45.跳跃游戏ii_小刘很ok的博客-爱代码爱编程

122.买卖股票的最佳时机II 此题看似挺复杂,其实就是低买高卖,拆分成局部就是第二天比今天高,就今天买入,明天卖出 就把问题转换成将两天间利润差正数部分相加 class Solution { public: i

代码随想录算法训练营第三十二天| 122.买卖股票的最佳时机ii,55. 跳跃游戏,45.跳跃游戏ii_isaac_mz的博客-爱代码爱编程

122. Best Time to Buy and Sell Stock II   贪心 一图解决问题  java class Solution { public int maxProfit(int[] prices) { int maxProfit = 0; // day 1 no profits,

leetcode| 122. 买卖股票的最佳时机ii、55. 跳跃游戏、45. 跳跃游戏ii day32-爱代码爱编程

122. Best Time to Buy and Sell Stock II 贪心 class Solution: def maxProfit(self, prices: List[int]) -> in

day32 | 122. 买卖股票的最佳时机 ii | 55. 跳跃游戏 |45. 跳跃游戏 ii-爱代码爱编程

122. 买卖股票的最佳时机 II 注意点: 1.买卖的最佳时机就是前后两个数之差,如果是正数的话就相加,是负数的话就加0;  class Solution { public: int maxProfit(vector<int>& prices) { int result = 0; for(

代码随想录算法训练营day 32 |122.买卖股票的最佳时机ii、55. 跳跃游戏、45.跳跃游戏ii-爱代码爱编程

122.买卖股票的最佳时机II 代码随想录 思路: 将买入卖出的收益分解到每一天,只需要将每一天的收益(前一天买入)为+的值累加即可得到最大收益。 代码: class Solution { public int maxProfit(int[] prices) { if(prices.length == 1) return

day32(贪心)|122. 买卖股票的最佳时机 ii 55. 跳跃游戏 45. 跳跃游戏 ii-爱代码爱编程

122. 买卖股票的最佳时机 II 题目链接:122. 买卖股票的最佳时机 II解题思路:可以把每天股票价格数组做差形成一个每天利润数组,然后用贪心每次都收集正利润,最后得到最大利润。第一天没有利润,要从第二天开始才有利润

leetcode刷题day32|122.买卖股票的最佳时机ii、55.跳跃游戏、45.跳跃游戏Ⅱ-爱代码爱编程

文章目录 一、122.买卖股票的最佳时机II二、55.跳跃游戏三、45.跳跃游戏Ⅱ 一、122.买卖股票的最佳时机II 这道题的精髓是:把相邻的两天捆绑到一起,如果第二天比第一天高,则在第一天买入,

代码随想录刷题day32 122.买卖股票的最佳时机ii;55. 跳跃游戏;45.跳跃游戏ii-爱代码爱编程

代码随想录刷题day32 122.买卖股票的最佳时机II;55. 跳跃游戏;45.跳跃游戏II 贪心的进阶题目。贪心相比动态规划更加简单,但是也只能针对固定题目。 122.买卖股票的最佳时机II 122. 买卖股票的最

代码随想录算法训练day32||122.买卖股票的最佳时机ii ||55. 跳跃游戏 ||45.跳跃游戏ii_股票数字代码输入速度练习游戏-爱代码爱编程

122.买卖股票的最佳时机II 思路: 本题首先要清楚两点: 只有一只股票!当前只有买股票或者卖股票的操作 想获得利润至少要两天为一个交易单元。 这道题目可能我们只会想,选一个低的买入,在选个高的卖,在选一个低的买入.....循环反复。 如果想到其实最终利润是可以分解的,那么本题就很容易了! class Solution { public:

算法记录day32|leetcode122.买卖股票的最佳时机ii、55. 跳跃游戏、45.跳跃游戏ii-爱代码爱编程

一、LeetCode122.买卖股票的最佳时机II   1.题目描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入: [7,1,5,3,6,4]

day32|leetcode:● 122.买卖股票的最佳时机ii ● 55. 跳跃游戏 ● 45.跳跃游戏ii-爱代码爱编程

题目链接:122. 买卖股票的最佳时机 II 1.思路 注意这题:可以当天买和当天出售 所以只要买正利润的票就行了,我们把每天的后一天的利润算出来,再倒序排序,前面都是正利润,都加起来,到负数后就停止累加 2.代码 class Solution { public: int maxProfit(vector<int>&