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

买卖股票的最佳时期Ⅱ

给定一个数组,它的第 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.mzph.cn/pingmian/2624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Android]使用CompositionLocal隐式传值

1.相关概念 CompositionLocal 是定义数据的方式&#xff0c;而 CompositionLocalProvider 是在 Compose UI 树中传递这些数据的工具。二者合作&#xff0c;为 Compose 应用提供了一个强大的状态和数据流管理机制&#xff0c;使得数据可以在组件间按需传递&#xff0c;而无需通…

使用Python实现批量删除MYSQL数据库的全部外键

我先说下场景&#xff0c;昨天因为我们使用了Java工作流框架flowable&#xff0c;它自动生成了许多工作流相关的表&#xff0c;但是这些表都有外键关联&#xff0c;如果单纯的使用sql语句去一个一个的删除外键&#xff0c;那会非常麻烦&#xff0c;所以我写了一个Python脚本来进…

云上如何实现 Autoscaling: AutoMQ 的实战经验与教训

01 背景 弹性是云原生、Serverless 的基础。AutoMQ 从软件设计之初即考虑将弹性作为产品的核心特质。对于 Apache Kafka 而言&#xff0c;由于其存储架构诞生于 IDC 时代&#xff0c;针对物理硬件设计&#xff0c;存储层强依赖本地存储&#xff0c;已不能很好地适应现在云的时…

Python自动化系列---Python基础2

1、 变量&#xff1a;存储数据的 保险柜&#xff1a;钱&#xff0c;金条&#xff0c;户口本&#xff0c;珠宝&#xff0c;古董 — 存储东西 数据类型&#xff1a; int float bool str 变量名&#xff08;见名知意&#xff09;&#xff1a;标识符&#xff08;不能用关键字&…

Linux:Centos7.x系统,无效的密码问题处理

一、情景说明 我新创建了Centos7系统&#xff0c;在使用的过程中&#xff0c;我需要创建一个test账号 那么&#xff0c;同时我就要给这个账号设置一个密码 为了方便&#xff0c;我设置成123456 就报错了 二、解决办法 其实这个问题很容易处理&#xff0c;不需要像其他帖子说…

项目报错com.mall.common.domain.request那么就说明你的项目里面是找不到导入类的包名或者路径

当你的项目里面一直报错是找不到导入类的包名或者路径的时候&#xff1a;com.mall.common.domain.request 这个问题我们阔以分为几个角度来想 1、包路径错误&#xff1a;确保com.mall.common.domain.request这个包路径在项目中是正确的。可能的情况是包名写错了&#xff0c;或…

java包装类型详解

一、用途 在Java语言中&#xff0c;包装类型&#xff08;Wrapper Classes&#xff09;是一种特殊的类&#xff0c;它们将八个基本数据类型&#xff08;byte、short、int、long、float、double、char、boolean&#xff09;封装在一个类中。这些包装类&#xff08;如Integer、Lon…

识别有效的IP地址和掩码并进行分类统计

问题概要 请解析IP地址和对应的掩码&#xff0c;进行分类识别。要求按照A/B/C/D/E类地址归类&#xff0c;不合法的地址和掩码单独归类。 所有的IP地址划分为 A,B,C,D,E五类 A类地址从1.0.0.0到126.255.255.255; B类地址从128.0.0.0到191.255.255.255; C类地址从192.0.0.0到223.…

opencv改变像素点的颜色---------c++

改变像素点的颜色 #include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include <filesystem>bool opencvTool::changeColor(const std::string image_p, int x_coor, int y_coor, const cv::Scalar color) {std::filesystem::path file(image_p);…

大模型检索召回系统:RAG技术的全面调查与未来展望

随着人工智能技术的飞速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了显著成就。然而&#xff0c;这些模型在处理特定领域或知识密集型任务时仍面临挑战&#xff0c;如产生错误信息或“幻觉”。为了克服这些难…

MC33665 + MC33774 控制流程及 TPL3 帧结构介绍

一. 概述&#xff1a; MC33665A&#xff1a;通用电池管理通信网关和变压器物理层 (TPL) 收发器。该设备通过标准通信协议转发来自不同 TPL&#xff08;NXP 的隔离菊花链协议&#xff09;端口的消息&#xff0c;标准通信协议可确保与市场上可用的微控制器兼容。 MC33774&…

vue实现进入某个页面后替换地址栏路径

需求背景&#xff1a;a系统进入b系统首页&#xff08;"/index"&#xff09;需要携带token&#xff0c;如 example.com/index?token"thisIsMyToken" 需要再b系统中将地址栏携带的token清除 getBtnType(type) {this.$router.push({path: "/",quer…

Fork for Mac v2.42 激活版 Git客户端

Fork for Mac是一款运行在Mac平台上的Git客户端&#xff0c;Fork Mac版具备基本的取、推、提交、修改、创建和删除分支和标签、创建和删除远程备份等功能&#xff0c;还有实用的差异查看器&#xff0c;你可以通过清晰的视图快速发现源代码中的更改。 Fork for Mac v2.42 激活版…

Golang | Leetcode Golang题解之第42题接雨水

题目&#xff1a; 题解: func trap(height []int) (ans int) {n : len(height)if n 0 {return}leftMax : make([]int, n)leftMax[0] height[0]for i : 1; i < n; i {leftMax[i] max(leftMax[i-1], height[i])}rightMax : make([]int, n)rightMax[n-1] height[n-1]for i…

常见术语:DI/DO、AI/AO 和 I/O

在自动化和控制系统领域&#xff0c;DI/DO、AI/AO 和 I/O 是常见的术语&#xff0c;分别代表不同类型的输入输出接口。它们在工业自动化、楼宇自动化、机器人技术等领域有广泛应用。下面详细解释这些术语及其使用示例。 一、DI/DO&#xff08;数字输入/数字输出&#xff09; 数…

React vs React Native写法上的不同

标签 <div> -> <View> / <ScrollView><p> -> <Text><input> -> <TextInput><image> -> <Image><button> -> <Button>css background-image -> <ImageBackground> 除此之外还有一…

一个简单的kafka 消费者

写一个简单的kafka 消费者 1. 依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency>2. 消费者 import com.xxxx.npi.module.common.msg.enums.Topic; import org.apache.…

watchEffect的使用

watchEffect 是 Vue 3 Composition API 中的一个函数&#xff0c;它用于在响应式数据变化时自动执行一个副作用函数。与 watch 不同&#xff0c;watchEffect 会自动收集其执行过程中访问到的响应式依赖&#xff0c;并在这些依赖发生变化时重新运行副作用函数。这意味着你不需要…

预防oracle的漏洞及其提权

防止Oracle数据库的漏洞及其潜在的权限提升&#xff0c;需要实施一系列综合的安全措施。这些措施不仅涉及技术配置&#xff0c;还包括过程管理和持续的安全评估。以下是有效防御Oracle数据库漏洞和提权攻击的一些关键步骤&#xff1a; 1. 安装和配置 安装最新安全补丁 定期更…

git提交注释规范插件

1、前言 为什么要注重代码提交规范&#xff1f; 在团队协作开发时&#xff0c;每个人提交代码时都会写 commit message。 每个人都有自己的书写风格&#xff0c;翻看我们组的git log, 可以说是五花八门&#xff0c;十分不利于阅读和维护。 一般项目开发都是多分支共存&#x…