Day 32 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

embedded/2024/9/22 22:25:12/

买卖股票的最佳时期Ⅱ

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

  • 输入: [7,1,5,3,6,4]
  • 输出: 7
  • 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

  • 输入: [1,2,3,4,5]
  • 输出: 4
  • 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

  • 输入: [7,6,4,3,1]
  • 输出: 0
  • 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

  • 1 <= prices.length <= 3 * 10 ^ 4

  • 0 <= prices[i] <= 10 ^ 4

    ​ 乍一看好像实现起来很难,其实把总的结果看成每两天的差值的累加即可,例如:

    ​ nums[3] - nums[0]可以视为 nums[3] - nums[2] + nums[2] - nums[1] + nums[1] - nums[0]

    ​ 这样做即可达到一个贪心的思路,寻找差值为正数的天数(局部最优),最多的正数差值累加即可返回最大利润(全局最优);

    class Solution {
    public:int maxProfit(vector<int>& prices) {int result = 0;for (int i = 1; i < prices.size(); i++) {result += max(prices[i] - prices[i - 1], 0);//将正数结果加入res,最后返回最大值}return result;}
    };
    

跳跃游戏

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

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

判断你是否能够到达最后一个位置。

示例 1:

  • 输入: [2,3,1,1,4]
  • 输出: true
  • 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:

  • 输入: [3,2,1,0,4]
  • 输出: false
  • 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

​ 初始i = 0,判断nums[i] + nums[nums[i]]能不能大于 nums[i] + i,再限定i < nums[i] ,看具体能跳到哪里……

​ 这么想就寄了,只需要看终点能否被有效覆盖即可,无须考虑怎样跳;

​ 所以这里for循环中i的条件不是i < nums[i],而是一个动态更新的覆盖范围:

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(nums[i] + i , cover);if(cover >= nums.size() - 1)    return true;}return false;}
};

跳跃游戏Ⅱ

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

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

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

示例:

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

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

​ 局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一;

​ 整体最优:每一步尽可能多走,从而达到最少步数;

​ 实际实现,依赖上题的覆盖范围实现:

​ 移动下标达到了当前这一步的最大覆盖最远距离,没有到达终点则再走一步来增加覆盖范围,直到覆盖范围覆盖了终点;

class Solution {
public:int jump(vector<int>& nums) {int cover1 = 0;//当前最大覆盖范围int cover2 = 0;//下一步最大覆盖范围int res = 0;if(nums.size() == 1)    return 0;for(int i = 0; i < nums.size(); i++){cover2 = max(nums[i] + i , cover2);//动态更新最大覆盖范围if(i == cover1){             if(cover1 != nums.size() - 1){res++;cover1 = cover2;if(cover2 >= nums.size() - 1)   break;}else break;}}return res;}
};

​ 上述代码可以精简处理,由于数组非负,所以只需要考虑是否能够移动到nums.size() - 2的位置即可,因此可以统一处理,即:

移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不考虑是不是终点的情况

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

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

// 版本二
class Solution {
public:int jump(vector<int>& 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;}
};

http://www.ppmy.cn/embedded/13222.html

相关文章

《Beginning C++20 From Novice to Professional》第二章Fundamental Types

本章将介绍C的基础数据类型&#xff0c;主要涉及下列方面&#xff1a; 变量的声明、初始化、赋值整数字面量浮点数如何计算变量类型转换字符相关auto关键字 Variables, Data, and Data Types 这里先给出变量的定义&#xff1a;有名字的一块内存&#xff0c;这个变量的类型决…

图片像素高效处理,轻松将图片像素进行按比例缩小50%并保存在指定位置,让您的图像更精致!

图像与我们的日常生活紧密相连&#xff0c;从社交媒体分享到专业摄影作品展示&#xff0c;高质量的图片像素处理显得至关重要。然而&#xff0c;面对海量的图片数据和高分辨率的图像处理需求&#xff0c;如何高效、简便地进行像素调整成为了众多用户关注的焦点。 第一步&#…

Redission分布式锁应用案例(生成业务单号)

//redission 客户端Component public class RedisUUID {Autowiredprivate RedisTemplate redisTemplate ;private UUIDStorage defaultUUIDStorage;private RedissonClient redissonClient;public RedisUUID(UUIDStorage defaultUUIDStorage , RedissonClient redissonClient){…

Python爬取猫眼电影票房 + 数据可视化

目录 主角查看与分析 爬取可视化分析猫眼电影上座率前10分析猫眼电影票房场均人次前10分析猫眼电影票票房占比分析 主角查看与分析 爬取 对猫眼电影票房进行爬取&#xff0c;首先我们打开猫眼 接着我们想要进行数据抓包&#xff0c;就要看网站的具体内容&#xff0c;通过按F12…

主打国产算力 广州市通用人工智能公共算力中心项目签约

4月9日&#xff0c;第十届广州国际投资年会期间&#xff0c;企商在线&#xff08;北京&#xff09;数据技术股份有限公司与广州市增城区政府就“广州市通用人工智能公共算力中心”项目进行签约。 该项目由广州市增城区人民政府发起&#xff0c;企商在线承建。项目拟建成中国最…

程序员过了35岁没人要?“这行越老越香”

程序员35岁失业&#xff1f;参加完OceanBase开发者大会&#xff0c;我又悟了&#xff01; 周六参加了OceanBase2024 开发者大会的现场&#xff0c;来之前我其实挺忐忑的&#xff0c;我觉得一个数据库产品的发布会&#xff0c;能有什么新鲜的东西&#xff1f; 踏入酒店的那一刻&…

SQL-DML数据操纵语言(Oracle)

文章目录 DML数据操纵语言常见的字段属性字符型字段属性char(n)varchar2(n)/varchar(n) 数值型字段属性number([p],[s]int 日期型字段属性DATEtimestamp 如何查看字段属性增加数据INSERT快捷插入 删除数据DELETE修改数据UPDATE DML数据操纵语言 定义 是针对数据做处理&#xf…

Vue2学习笔记(尚硅谷天禹老师)

目录 一、入门案例 二、模板语法 三、数据绑定 四、el和data的两种写法 五、MVVM模型 六、Object.defineproperty方法 七、Vue中响应式原理 八、数据代理 九、methods配置项 十、Vue中的事件处理 十一、Vue中的键盘事件 十二、计算属性 十三、监视属性watch 十四、绑定Class样式…