【JAVA算法|hot100】贪心算法类型题目详解笔记

这里记录刷hot100的思考过程详解,方便后续记忆复习。

贪心算法基本没什么模板,关键在于思考怎样让局部最优扩散到全局最优。一般会有一个max值存储当前所能够到的最远/最大位置

题号121

121. 买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0

具体题解
java 复制代码
class Solution {
    public int maxProfit(int[] prices) {
        int ans=0;
        int min=Integer.MAX_VALUE,max=Integer.MIN_VALUE;
        for(int i=0;i<prices.length;i++){
            if(prices[i]<min){
                min=prices[i];
            }
            ans=Math.max(prices[i]-min,ans);
        }
        return ans;
    }
}
思路解析

遍历prices,每次只卖目前以来最小的。

必会知识

题号55

55. 跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false

具体题解
java 复制代码
class Solution {
    public boolean canJump(int[] nums) {
        int step=0,tmp=0;
        for(int i=0;i<=tmp&&i<nums.length-1;i++){
            step=Math.max(step,nums[i]+i);
            tmp=step;
        }
        if(step>=nums.length-1){
            return true;
        }
        return false;
    }
}
思路解析

用step保存能跳的最远的值,对其实时更新。

必会知识

题号45

45. 跳跃游戏 II

给定一个长度为 n0 索引 整数数组 nums。初始位置在下标 0。

每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在索引 i 处,你可以跳转到任意 (i + j) 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 n - 1 的最小跳跃次数。测试用例保证可以到达 n - 1

具体题解
java 复制代码
class Solution {
    public int jump(int[] nums) {
        int rightmost=0,step=0,end=0;
        for(int i=0;i<nums.length-1;i++){
               rightmost=Math.max(rightmost,i+nums[i]);
               if(i==end){
                end=rightmost;
                step++;
           }
        }
        return step;
    }
}
思路解析

每次都记录跳的最远的位置,只有当当前遍历的下标到了上一次确定的最远位置时step才会加一

必会知识

题号763

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串 "ababcc" 能够被分为 ["abab", "cc"],但类似 ["aba", "bcc"]["ab", "ab", "cc"] 的划分是非法的。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s

返回一个表示每个字符串片段的长度的列表。

具体题解
java 复制代码
class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> ans=new ArrayList<>();
        int[] last=new int[26];
        int start=0,end=0;
        for(int i=0;i<s.length();i++){
            last[s.charAt(i)-'a']=i;
        }
        for(int i=0;i<s.length();i++){
            end=Math.max(end,last[s.charAt(i)-'a']);
            if(end==i){
                ans.add(end-start+1);
                start=end+1;
            }
        }
        return ans;
    }
}
思路解析

用数组下标存储26个字母,先记录每个字母最后出现的位置。

必会知识

相关推荐
咖啡八杯1 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
GuWenyue1 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
优橙教育1 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵2 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
我叫洋洋3 小时前
C ++ [ hello world ]
c语言·c++·算法
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel3 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
圣光SG4 小时前
Servlet学习笔记
笔记·学习·servlet
奋发向前wcx4 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法