[LeetCode]Hot100系列.贪心总结+思想总结

专题总结:

贪心给我最大的感觉就是要在每一次循环中找到最优解,我贪心的(QAQ)看了很多题解,后面发现了一些共性,这几道题都通过在循环中维护一个类似边界数的概念.每次循环里面更新,然后再在每一次循环,也就是(每一次选择)都做出最优解,也就是贪心.代码量少,但是这个思想却不像代码一样好理解,抽象出他们的共性.

------------------逐题思路+代码-----------------------------

思路:循环遍历时判断, 更新当前最低价格然后更新最大利润

代码:

java 复制代码
class Solution {
    public int maxProfit(int[] prices) {
        int minprice=Integer.MAX_VALUE;
        int maxprofit=0;
        for(int i=0;i<prices.length;i++){
            if(minprice>prices[i]){
                minprice=prices[i];
            }else if(maxprofit<prices[i]-minprice){
                maxprofit=prices[i]-minprice;
            }
        }
        return maxprofit;
    }
}

思路:

记录最远能抵达位置,每次循环更新最远抵达位置,如果循环的i超过了最远抵达位置,那说明出错了,要是循环正常走完了.

java 复制代码
class Solution {
    public boolean canJump(int[] nums) {
        int maxPosition = 0;//跳跃最远位置;
        for(int i=0;i<nums.length;i++){
           if(i>maxPosition){return false;}
           maxPosition=Math.max(maxPosition,i+nums[i]);
        }
        return true;
    }
}

思路:

每一步都选最优解,这听上去也太笼统了

放到眼下这道题,就要记录每一次能跳跃的最远距离

(这里用一下评论区大佬的题解图片)

和上一道一样,要在循环里面维护最远能抵达到哪里,为了统计步数,还要有一个end来统计每一次都边界,每到这个边界说明跳一次,跳到目前能抵达的最远位置,且步数+1

这里要注意一个细节,就是for循环中,i<nums.length

1,少了末尾。因为开始的时候边界是第0个位置,steps已

经加1了。如下图,如果最后一步刚好跳到了末尾,此时

steps其实不用加1了。如果是是i<nums.length,i遍历

到最后的时候,会进入if语句中,steps会多加1。

代码:

java 复制代码
class Solution {
    public int jump(int[] nums) {
        int maxPosition = 0;//跳跃的最远位置
        int step =0;//步数
        int end=0; //当前能跳跃的边界
        for(int i=0;i<nums.length-1 ;i++){
            //找能跳到最远
            maxPosition=Math.max(maxPosition,nums[i]+i);
            if(i==end){
                //说明当前走到一次边界(上一次最远),再把最远值更新一下,步数+1
                end=maxPosition;
                step++;
            }
        }
        return step;
    }
}

思路:通过这个end就是字符出现的最后一个索引,找到一个end在开启下一个start和end的判断.

代码:

java 复制代码
class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] last= new int[26];
        int length=s.length();
        for(int i=0;i<length;i++){
            //循环遍历把每个字符出现的最后一次索引位置都记到数组里面
            last[s.charAt(i)-'a']=i;
        }
        //初始化
        List<Integer> res=new ArrayList<>();
        int start=0;
        int end=0;
        for(int i=0;i<length;i++){
            //按字符串顺序,遍历,每一个字符的最后索引位置更新到end,包含进去的字符不管,当最远的这个end处理完再开始下一次
            end=Math.max(end,last[s.charAt(i)-'a']);
            if(i==end){
                //说明当前片段已经覆盖所有出现字符的最后位置
                res.add(end-start+1);
                //重置start
                start=end+1;
            }
        }
        return res;
    }
}
相关推荐
W23035765734 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
minji...4 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
语戚5 小时前
力扣 968. 监控二叉树 —— 贪心 & 树形 DP 双解法递归 + 非递归全解(Java 实现)
java·算法·leetcode·贪心算法·动态规划·力扣·
skywalker_115 小时前
力扣hot100-7(接雨水),8(无重复字符的最长子串)
算法·leetcode·职场和发展
bIo7lyA8v7 小时前
算法稳定性分析中的输入扰动建模的技术9
算法
CoderCodingNo7 小时前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
sinat_286945197 小时前
AI Coding 时代的 TDD:从理念到工程落地
人工智能·深度学习·算法·tdd
炽烈小老头7 小时前
【 每天学习一点算法 2026/04/12】x 的平方根
学习·算法
ASKED_20197 小时前
从排序到生成:腾讯广告算法大赛 2025 baseline解读
人工智能·算法