Hot100 贪心算法

ops/2025/2/28 3:38:58/

如果非要说这些题的共性,也许就是:在边界内不断寻找最优解

 



121. 买卖股票的最佳时机 - 力扣(LeetCode)

总结一下思路就是:如果第i天卖出股票,则最大利润为(该天的股价-前面天数中最小的股价),然后与已知的最大利润比较,如果大于则更新当前最大利润的值。

分享|股票问题系列通解(转载翻译) - 力扣(LeetCode)

53. 最大子数组和 - 力扣(LeetCode)

55. 跳跃游戏 - 力扣(LeetCode)

使用算法>贪心算法,维护一个变量 maxReach,表示当前能够到达的最远位置。遍历数组时,更新 maxReach,如果在某个位置无法再前进,则直接返回 false。如果能够到达或超过最后一个位置,则返回 true

class Solution {public boolean canJump(int[] nums) {//每个nums[i]维护的是最大跳跃长度 你当然也可以只跳1,2步int maxreach=0;for(int i=0;i<nums.length;i++){if(maxreach<i){//跳不到这里return false;}if(maxreach>=nums.length-1){//已经可以跳跃的最长长度大于数组长度了return true;}maxreach=Math.max(maxreach,i+nums[i]);}//一直到最后也没到末尾return false;
}
}

 45. 跳跃游戏 II - 力扣(LeetCode)

核心思路

算法的核心是贪心思想:每次跳跃时,选择一个能够到达的最远位置,这样可以尽量减少跳跃次数。当然了,每次都跳到最远的也不一定能得到好的结果,所以我们就额外在每次的边界内探索一下如果不跳最远的话是不是有更好的结果

注意:

  1. i < nums.length - 1

    • 确保循环在到达最后一个位置之前结束。

    • 如果在循环结束时,border 已经大于或等于 nums.length - 1,说明可以到达终点。

public class Solution {public int jump(int[] nums) {int jumps = 0; // 跳跃次数int border = 0;  // 记录当前能跳跃到的位置的边界下标int farthest = 0;    // 记录在边界范围内,能跳跃的最远位置的下标for (int i = 0; i < nums.lengh - 1; i++) {// 继续往下遍历,统计边界范围内,哪一格能跳得更远,每走一步就更新一次能跳跃的最远位置下标farthest = Math.max(farthest, i + nums[i]); if (i == border) { // 如果到达当前跳跃的最远位置jumps += 1; // 增加跳跃次数border = farthest; // 更新当前跳跃的边界}}return jumps; // 返回最小跳跃次数}
}

非要加的花

public class Solution {public int jump(int[] nums) {int border=0;int jump=0;int maxreach=0;for(int i=0;i<nums.length;i++){//每一个节点都要看看最远能到哪maxreach=Math.max(maxreach,nums[i]+i);if(border==nums.length-1) return jump;if(i==border){// 该跳跃了,不管接下来走几步都算是一次跳跃jump++;border=maxreach;//更新当前点出发的边界}}return jump;}
}

763. 划分字母区间 - 力扣(LeetCode) 

其实还是有点稀里糊涂的 ,没有办法找到共性。

class Solution {public List<Integer> partitionLabels(String s) {int end=-1;int start=0;List<Integer> result = new ArrayList<>();// key 字符; value 出现一系列下标集合Map<Character, Integer> map = new HashMap<>();// 第一次遍历:记录每个字符的最远位置for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);map.put(c, i); // 更新字符的最远位置}//第二次遍历 用来扫描切割区间for(int i=0;i<s.length();i++){char c=s.charAt(i);//更新当前endend=Math.max(end,map.get(c));//遍历字符串,如果已扫描部分的所有字符,都只出现在已扫描的范围内,即可做切割。if(i==end){//当前边界之前所有节点已经被判断过 没有后面出现的更新了endresult.add(end-start+1);start=end+1;}}return result;}
}


http://www.ppmy.cn/ops/161846.html

相关文章

重学SpringBoot3-整合 Elasticsearch 8.x (一)客户端方式

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-整合 Elasticsearch 8.x &#xff08;一&#xff09;客户端方式 1. 为什么选择 Elasticsearch&#xff1f;2. Spring Boot 3 和 Elasticsearch 8.x 的集成概述 2.1 准…

Linux MySQL 8.0.29 忽略表名大小写配置

Linux MySQL 8.0.29 忽略表名大小写配置 问题背景解决方案遇到的问题&#xff1a; 问题背景 突然发现有个大写的表报不存在。 在Windows上&#xff0c;MySQL是默认支持忽略大小写的。 这个时候你要查询一下是不是没有配置&#xff1a; SHOW VARIABLES LIKE lower_case_table…

DeepSeek 15天指导手册——从入门到精通 PDF(附下载)

DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…

数据库二三事(8)

高级数据查询 top词语法格式&#xff1a;TOP n &#xff08;percent&#xff09;&#xff08;with ties&#xff09; 查询前n&#xff08;%&#xff09;行数据&#xff0c;&#xff08;包括最后一行取值并列&#xff09; 搭配 order by case&#xff1a; CASE &#xff08;…

解锁Redis的深层能力:事务与消息队列的最佳实践

在当今数据驱动的世界里&#xff0c;高效的数据管理和处理成为了每一个成功应用的核心。Redis&#xff0c;作为一款高性能的内存数据库&#xff0c;不仅以其快速读写能力著称&#xff0c;还提供了诸如事务、持久化、以及灵活的消息队列实现等高级功能&#xff0c;使得开发者能够…

【C++编程入门基础(一)】

文章目录 一、什么是C二、命名空间&#xff08;1&#xff09;为什么有命名空间&#xff08;2&#xff09;命名空间的定义&#xff08;3&#xff09;命名空间的使用 三、输入和输出&#xff08;1&#xff09;输出&#xff08;2&#xff09;输入&#xff08;3&#xff09;总结 四…

JavaWeb-ServletContext应用域接口

文章目录 ServletContext接口简介获取一个ServletContext对象ServletContext接口中的相关方法获取应用域配置参数关于应用域参数的配置要求getContextPath获取项目路径getRealPath获取真实路径log系列方法添加相关日志增删查应用域属性 ServletContext接口简介 ServletContext…

C语言【指针篇】(三)

C语言【指针篇】&#xff08;三&#xff09; 前言正文1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 总结 前言 本文主要基于前面对指针的掌握&#xff0c;进一步学习&#xff1a;数组名的理解、使用指针…