LeetCode热题100之贪心算法

1.买卖股票的最佳时机

在这里插入图片描述
思路分析:即需要找出某一天的最低价格和它后面几天的最高价格差。

  • 维护一个变量min_price,表示到目前为止遇到的最低股票价格;
  • 遍历prices数组,在每一天的价格上:
    • 更新min_price为当前的价格和min_price中的较小值;
    • 计算当天价格减去min_price的利润,即当天卖出的最大可能利润;
    • 将这个利润与之前记录的max_profit做比较,保留较大的利润
  • 最终得到的max_profit就是最大利润

具体实现代码(详解版):

class Solution {
public:int maxProfit(vector<int>& prices) {int min_price = INT_MAX; // 初始化为一个很大的数int max_profit = 0; // 初始最大利润为0for (int price : prices) {// 更新最小价格min_price = min(min_price, price);// 计算当前价格与最小价格的差值,并更新最大利润max_profit = max(max_profit, price - min_price);}return max_profit;}
};
  • 时间复杂度为O(n).

2.跳跃游戏

在这里插入图片描述
思路分析:贪心法适用于这种问题,因为我们每一步只需要关注从当前的最远位置能否再往前推进。只要每次都记录并更新最远位置,就能知道是否能够到达最后一个位置。

  • 定义最远可达位置:在遍历数组时,记录当前可以到达的最远位置。定义一个变量 farthest 来表示从起点到当前位置可以到达的最远下标。;
  • 遍历数组
    • 如果在遍历到某个位置 i 时,发现 farthest 小于 i,说明从起点出发无法到达位置 i,因此直接返回 false。
    • 从第一个位置开始遍历,每次更新 farthest 为当前位置 i 加上 nums[i],即 farthest = max(farthest, i + nums[i])。
  • 判断是否能到达最后一个位置
    • 在遍历结束后,如果 farthest 已经超过或等于最后一个下标,说明可以到达最后一个位置,返回 true。
    • 否则返回 false。

具体实现代码(详解版):

class Solution {
public:bool canJump(vector<int>& nums) {int n = nums.size();int farthest = 0;//可以跳跃到的最远位置for(int i = 0 ; i < n ; i ++){if(farthest < i){//从起点无法到达ireturn false;}farthest = max(farthest,i + nums[i]);//更新farthest}return farthest >= n - 1 ? true : false; //最后的判断 }
};
  • 时间复杂度:O(n);
  • 空间复杂度:O(n)

3.跳跃游戏II

在这里插入图片描述
思路分析:这是一个最小跳跃次数的问题,可以使用贪心算法来解决

  • 定义变量
    • 用min_jump记录总的跳跃数;
    • 用current_end记录当前跳跃的边界,即在这一条内能跳到的最远位置
    • 用farthest记录可以到达的最远位置
  • 遍历数组
    • 遍历数组,逐步更新farthest表示当前位置能到达的最远位置;
    • 当遍历到边界current_end时,说明必须进行一次跳跃来继续前进,此时min_jump增1,并更新current_end为farthest
  • 结束条件:如果currnt_end已经到达或超过数组末尾,说明可以到达终点,返回min_jump即可。

具体实现代码(详解版)

class Solution {
public:int jump(vector<int>& nums) {int min_jump = 0;// 记录跳跃次数int farthest = 0;// 当前跳跃的边界int current_end = 0;// 在当前跳跃中能够到达的最远位置int n = nums.size();if(n <= 1) return 0;//如果数组长度为或更小,不需要跳跃for(int i = 0 ; i < n ; i ++){farthest = max(farthest,i + nums[i]);//更新最远位置//到达当前跳跃的边界,必须进行一次跳跃if(i == current_end){min_jump ++;//次数加1current_end = farthest;//更新跳跃边界为最远位置// 如果已经可以到达或超过最后一个位置,直接返回跳跃次数if(farthest >= n -1) break;}}return min_jump;}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

4.划分字母区间

在这里插入图片描述
思路分析:这个问题要求将字符串 s 划分为尽可能多的片段,并确保每个片段内的字符不会重复出现。我们可以通过 贪心算法 来实现这个需求

  • 记录每个字符的最后出现位置:首先,我们需要确定每个字符在字符串中最后出现的位置。因为一旦一个字符在某个位置被包含在某个片段中,我们就可以保证该字符在这个片段的范围内,后续再出现该字符时就不能被包含到当前片段中,而必须开始新的片段。
    • 我们遍历字符串 s,利用一个哈希表 lastIndex 记录每个字符在字符串中的最后位置。这样可以随时查询到某个字符的最后出现位置。

为什么记录最后出现位置:
例如,在字符串 “abac” 中,字符 ‘a’ 在索引 0 和索引 3 出现,我们需要知道 ‘a’ 在索引 3 处最后一次出现,这样我们就可以在第 0 到第 3 索引之间创建一个片段,确保 ‘a’ 被包含在这个片段内。

  • 确定片段的范围:在遍历字符串时,我们使用一个变量 end 来记录当前片段的结束位置。这个结束位置会随着我们遇到字符并更新字符的最后出现位置而动态变化。
    • 当遍历到一个字符 s[i] 时,我们查找该字符的 最后出现位置,并更新 end 为 max(end, lastIndex[s[i]]),确保 end 记录了当前片段的最远边界。
    • 如果当前的索引 i 达到了 end,说明当前片段已经完成,因为所有在这个片段内的字符的最后出现位置都已经在片段内了。
  • 划分片段并记录片段长度:当我们确定一个片段已经结束时,我们就记录该片段的长度,并且将 start 更新为下一个片段的起始位置。这样就能不断划分新的片段。
    • 当 i == end 时,说明当前片段已经完全确定,片段的长度是 end - start + 1;
    • 记录片段长度后,将 start 更新为 i + 1,开始下一个片段的划分。

具体实现代码(详解版);

class Solution {
public:vector<int> partitionLabels(string s) {vector<int> result;  // 用来保存最终的片段长度unordered_map<char, int> lastIndex;  // 用于记录每个字符最后出现的位置// Step 1: 记录每个字符的最后出现位置for (int i = 0; i < s.size(); i++) {lastIndex[s[i]] = i;}int start = 0, end = 0;  // start记录当前片段的起始位置,end记录当前片段的结束位置// Step 2: 遍历字符串确定片段for (int i = 0; i < s.size(); i++) {end = max(end, lastIndex[s[i]]);  // 更新当前片段的结束位置if (i == end) {  // 当前片段结束result.push_back(end - start + 1);  // 记录当前片段的长度start = i + 1;  // 更新下一个片段的起始位置}}return result;  // 返回所有片段的长度}
};
  • 时间复杂度:O(1)
  • 空间复杂度:O(1).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/468040.html

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

相关文章

git 对已提交的说明进行编辑

如果提交代码的时候&#xff0c;对上次提交代码的说明不准确的话&#xff0c;例如 1、可以使用 git log 查看代码提交的记录&#xff1b; 2、使用 git commit --amend 命令对上次提交的说明进行编辑&#xff1a; 当显示上次提交的内容的时候&#xff0c;按下键盘 i 键即可编辑…

Hive简介 | 体系结构

Hive简介 Hive 是一个框架&#xff0c;可以通过编写sql的方式&#xff0c;自动的编译为MR任务的一个工具。 在这个世界上&#xff0c;会写SQL的人远远大于会写java代码的人&#xff0c;所以假如可以将MR通过sql实现&#xff0c;这个将是一个巨大的市场&#xff0c;FaceBook就这…

四期书生大模型实战营(【基础岛】- 第1关 | 书生·浦语大模型开源开放体系)

文章目录 1. 性能提升、推理能力领先1.1. 书生浦语开源时间线1.1.1. 时间节点1.1.2. InternLM性能天梯 1.2. 模型亮点1.2.1. 推理能力1.2.2. 长文本支持1.2.3. 复杂任务的自动规划与搜索 1.3. 核心技术思路 2. 支持多模态预训练与微调2.1. 开源模型谱系2.2. 核心优势 3. 书生浦…

python之正则表达式总结

正则表达式 对于正则表达式的学习&#xff0c;我整理了网上的一些资料&#xff0c;希望可以帮助到各位&#xff01;&#xff01;&#xff01; 我们可以使用正则表达式来定义字符串的匹配模式&#xff0c;即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与…

Jmeter的安装,设置中文,解决乱码问题

1.Jmeter安装 1-Jmeter如何下载 1---我这里提供一个下载快的方式 https://www.123684.com/s/lWZKVv-4jiav?提取码:4x4y 2---Jmeter官网下载地址 Apache JMeter - Download Apache JMeter 2-配置java环境 1---下载javaJDK 官方下载地址 https://www.oracle.com/java/techno…

机器学习(七)——集成学习(个体与集成、Boosting、Bagging、随机森林RF、结合策略、多样性增强、多样性度量、Python源码)

目录 关于1 个体与集成2 Boosting3 Bagging与随机森林4 结合策略5 多样性X 案例代码X.1 分类任务-Adaboost-SVMX.1.1 源码X.1.2 数据集&#xff08;鸢尾花数据集&#xff09;X.1.3 模型效果 X.2 分类任务-随机森林RFX.2.1 源码X.2.2 数据集&#xff08;鸢尾花数据集&#xff09…

融合虚拟与现实,AR Engine为用户提供沉浸式交互体验

当今的应用市场中&#xff0c;传统的应用产品已经难以完全满足消费者的多样化需求。为了在竞争激烈的市场中脱颖而出&#xff0c;企业需要深入洞察用户需求&#xff0c;提供个性化的服务体验和差异化的产品创新&#xff0c;以吸引并留住消费者。 比如&#xff0c;购物类App通过…

「QT」几何数据类 之 QPolygon 多边形类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

.NET 一款替代cmd.exe的交互式命令渗透工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

跨境访问难题?SD-WAN跨境加速专线加速电商社交媒体推广

在全球化日益加深的今天&#xff0c;跨境电商已成为企业拓展国际市场的重要途径。然而&#xff0c;跨境电商在社交媒体平台进行推广时&#xff0c;常常面临一系列网络访问难题&#xff0c;如公网速度慢、员工办事效率低下、IP被封禁以及公司运维对网络维护的繁琐等。这些问题不…

让redis一直开启服务/自动启动

文章目录 你的redis是怎么打开的黑窗不能关?必须要自动启动吗?再说说mysql 本文的所有指令都建议在管理员权限下打开cmd控制台 推荐的以管理员身份打开控制台的方式 Win R 打开运行 输入cmdShift Ctrl Enter 你的redis是怎么打开的 安装过redis的朋友都知道, redis的安…

Python 分子图分类,GNN Model for HIV Molecules Classification,HIV 分子图分类模型;整图分类问题,代码实战

一、分子图 分子图&#xff08;molecular graph&#xff09;是一种用来表示分子结构的图形方式&#xff0c;其中原子被表示为节点&#xff08;vertices&#xff09;&#xff0c;化学键被表示为边&#xff08;edges&#xff09;。对于HIV&#xff08;人类免疫缺陷病毒&#xff…

vue项目实战

1.项目文件夹添加&#xff08;结构如下&#xff09; 2.页面构建 安装路由 npm install react-router-dom 3.页面基本模板 router文件夹下index.js的模板 // 引入组件 import Login from "../views/login"; // 注册路由数组 const routes [{// 首页默认是/path: …

势不可挡 创新引领 | 生信科技SOLIDWORKS 2025新品发布会·苏州站精彩回顾

2024年11月01日&#xff0c;由生信科技举办的SOLIDWORKS 2025新产品发布会在江苏苏州圆满落幕。现场邀请到制造业的专家学者们一同感受SOLIDWORKS 2025最新功能&#xff0c;探索制造业数字化转型之路。 在苏州站活动开场&#xff0c;达索系统专业客户事业部华东区渠道经理马腾飞…

论文阅读《Structure-from-Motion Revisited》

摘要 增量式地运动结构恢复是从无序图像集合中进行三维重建的一个普遍策略。虽然增量式地重建系统在各个方面上都取得了巨大的进步&#xff0c;但鲁棒性、准确性、完整度和尺度仍然是构建真正通用管道的关键问题。我们提出了一种新的运动结构恢复技术&#xff0c;它改进了目前…

【人工智能】10分钟解读-深入浅出大语言模型(LLM)——从ChatGPT到未来AI的演进

文章目录 一、前言二、GPT模型的发展历程2.1 自然语言处理的局限2.2 机器学习的崛起2.3 深度学习的兴起2.3.1 神经网络的训练2.3.2 神经网络面临的挑战 2.4 Transformer的革命性突破2.4.1 Transformer的核心组成2.4.2 Transformer的优势 2.5 GPT模型的诞生与发展2.5.1 GPT的核心…

Vue 组件传递数据-Props(六)

一、Props传递静态数据 defineProps() 和 defineEmits() 为了在声明 props 和 emits 选项时获得完整的类型推导支持&#xff0c;我们可以使用 defineProps 和 defineEmits API&#xff0c;它们将自动地在 <script setup> 中可用&#xff1a; defineProps 和 defineEmits …

移动开发(七):.NET MAUI使用RESTAPI实现查询天气笔记

目录 一、接口准备 二、实体部分 三、页面部分 四、后台代码逻辑 五、总结 在移动开发过程中,第三方对接是非常常见的。今天给大家分享.NET MAUI如何使用REST API实现输入城市名称查询天气的示例,希望对大家学习.NET MAUI可以提供一些帮助! 一、接口准备 首先我们需要…

【网络安全 | 并发问题】Nginx重试机制与幂等性问题分析

未经许可,不得转载。 文章目录 业务背景Nginx的错误重试机制proxy_next_upstream指令配置重试500状态码非幂等请求的重试问题幂等性和非幂等性请求non_idempotent选项的使用解决方案业务背景 在现代互联网应用中,高可用性(HA)是确保系统稳定性的关键要求之一。为了应对服务…

C++入门基础(三)

目录 引用引用概念例子1例子2例子3例子4常引用拓展 引用 引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。 比如&#xff1a;同学A有一个别名为张…