[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;
    }
}
相关推荐
历程里程碑1 小时前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
YGGP2 小时前
【Golang】LeetCode 128. 最长连续序列
leetcode
你撅嘴真丑8 小时前
第九章-数字三角形
算法
uesowys8 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder8 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮8 小时前
AI 视觉连载1:像素
算法
智驱力人工智能9 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥10 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风10 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風10 小时前
8.1 PFH&&FPFH
图像处理·算法