[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;
    }
}
相关推荐
倒头就睡的小比特11 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!12 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼13 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光14 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark14 小时前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her114 小时前
并查集-听课笔记
笔记·算法·并查集
码流子14 小时前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven15 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark15 小时前
从算法设计模式看编程思维的抽象能力4
算法
2601_9622186115 小时前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法