当前位置: 首页 > news >正文

LeetCode Hot 100——贪心部分

121. 买卖股票的最佳时机

把每天价格当成一条曲线。你想在某天卖出时赚钱最多,就等价于:

对每一天i作为“卖出日”,找它之前出现过的最低价格作为“买入价”。

所以只要一路扫过去,同时维护:

  • 到今天为止的最低价minPrice
  • 到今天为止的最大利润maxProfit

当你看到今天价格price

  • 如果今天卖:利润 =price - minPrice
  • 更新最大利润
  • 顺便更新minPrice = min(minPrice, price)
class Solution { public int maxProfit(int[] prices) { int minPrice = Integer.MAX_VALUE; int maxProfit = 0; for(int p : prices) { if(p < minPrice) { minPrice = p; } maxProfit = Math.max(maxProfit, p - minPrice); } return maxProfit; } }

55. 跳跃游戏

贪心本质:维护“最远可达位置”far

从左到右扫:

  • far表示:在当前已经能到达的范围内,通过某个点再跳一步,最远能到哪
  • 如果扫到某个位置i时发现i > far:说明 这个位置根本到不了,后面更不可能到,直接 false
  • 否则更新:far = max(far, i + nums[i])
  • 最后如果far >= n-1就能到终点
class Solution { public boolean canJump(int[] nums) { int far = 0; for(int i = 0;i < nums.length;++i) { if(i > far) { return false; } far = Math.max(far, i + nums[i]); if(far >= nums.length - 1) return true; } return true; } }

45. 跳跃游戏 II

核心思路:两段边界 + 一次扫描

维护三个量:

  • end:当前这一跳能覆盖到的最右边界(这一层的边界)
  • far:在扫描当前层[0..end]的过程中,能拓展到的下一层最远位置
  • steps:跳跃次数

扫描i从 0 到 n-2(最后一个点不需要再跳):

  1. 更新下一层最远:far = max(far, i + nums[i])
  2. 如果i == end,说明当前层扫描完了,必须“跳一次”进入下一层:
  3. steps++
  4. end = far(把当前层边界推进到下一层最远)

为什么对?
因为你在当前这一跳能到的所有位置里,选一个点作为落脚点,你希望下一跳覆盖最远;扫描这一层时取到的最大i+nums[i]就是最优的下一层边界。

class Solution { public int jump(int[] nums) { int n = nums.length; int end = 0; // 当前跳的边界 int far = 0; // 下一跳的最远边界 int steps = 0; // 记录步数 for(int i = 0;i < n - 1;++i) { // 注意是小于n-1, 因为到终点不用再跳,无需扫描 far = Math.max(far, i + nums[i]); if(i == end) { steps++; end = far; // 每次跳时吧end更新为上一轮记录的far } } return steps; } }

763. 划分字母区间

核心思路:先记录每个字符最后出现的位置

做两步:

Step A:统计last[c]

last[c]= 字符c在字符串中最后出现的下标。

Step B:从左到右扫,动态扩展当前片段的右边界end

  • 设当前片段起点start
  • 扫描到位置i,字符是s[i]
  • 更新end = max(end, last[s[i]])
    意思是:当前片段里出现的所有字符,它们的最后位置都必须被包含进来
  • i == end:说明这段已经“封口”了(片段里所有字符的最后一次出现都在片段内),可以切一刀:
    • 片段长度end - start + 1
    • start = i + 1开启下一段

这是贪心:能尽早切就尽早切,因为一旦满足条件(i==end),再往右只会让片段变长,不会让片段数量更多/更优。

class Solution { public List<Integer> partitionLabels(String s) { int[] last = new int[26]; int n = s.length(); for(int i = 0;i < n;++i) { last[s.charAt(i) - 'a'] = i; } int start = 0, end = 0; List<Integer> res = new ArrayList<>(); for(int i = 0;i < n;++i) { end = Math.max(end, last[s.charAt(i) - 'a']); if(i == end) { res.add(end - start + 1); start = i + 1; } } return res; } }
http://www.jsqmd.com/news/491879/

相关文章:

  • spaCy v2.0:自定义流水线组件与扩展属性实战
  • 赋能智慧电厂:一块开发板如何重塑能源安全巡检的底层逻辑
  • 相比高防IP,为什么现在的游戏公司更倾向于选择“湘情盾”?
  • 2026年全国精密传动设备供应商选型测评:行星减速机与中空旋转平台综合指南 - 深度智识库
  • 从标准件到定制化:2026车床刀座选型全流程指南与品牌推荐 - 品牌推荐大师1
  • Linux 基础IO (五)深入理解文件系统
  • 国产化编辑器如何扩展KindEditor的Excel公式导入?
  • 将文本转化为向量化表示
  • ansys apdl 车轨耦合车桥耦合 列车模型:考虑车体、转向架、车轮质量和二系悬挂 钢轨
  • 计算机毕业设计springboot高校学生党员信息管理系统 基于SpringBoot的高校党建信息化管理平台 基于SpringBoot的智慧校园党员服务系统
  • 全志H618
  • ceph提供rbd存储
  • 飞函私有化,安全重塑跨部门协作
  • 建议收藏|2026知网新规下如何降AI?国内外5款降低AIGC率工具实测(含免费降AI教程) - 殷念写论文
  • Unity Shader 实战:从零掌握 PBR 基于物理的渲染
  • django基于大数据技术的医疗数据分析与研究
  • CoPaw网页爬虫skill技能及定时任务管理
  • Linux 命令之 uname 详解(查看系统信息)
  • Python全栈入门到实战【基础篇 23】函数式编程:高阶函数与匿名函数
  • 中断很难?看完这篇就懂了
  • Claude code安装/CC switch安装
  • 伟伦定制工厂店
  • 医疗HIS系统Java如何通过控件优化病历图片文件夹的浏览器端分片加密断传?
  • 315严选好锅:京尚纯陶瓷锅具,健康看得见
  • 基于Spring Boot的高校二手市场交易系统设计与实现vue3
  • 2026大专财富管理毕业生面临的岗位饱和问题及数据分析技能的应对策略
  • COMSOL太赫兹超表面BIC与能带折叠
  • 57.状态机的几种实现方式
  • sqlmap 魔改研究 —— 从流量特征到 WAF 对抗
  • 这个PSO优化BP神经网络的骚操作有点东西啊!咱们今天不整那些虚头巴脑的理论推导,直接手撕代码看看这玩意儿到底怎么玩的