[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;
    }
}
相关推荐
I_LPL6 小时前
hot100贪心专题
数据结构·算法·leetcode·贪心
颜酱6 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
WolfGang0073217 小时前
代码随想录算法训练营 Day16 | 二叉树 part06
算法
2401_831824968 小时前
代码性能剖析工具
开发语言·c++·算法
Sunshine for you9 小时前
C++中的职责链模式实战
开发语言·c++·算法
qq_416018729 小时前
C++中的状态模式
开发语言·c++·算法
2401_884563249 小时前
模板代码生成工具
开发语言·c++·算法
2401_8319207410 小时前
C++代码国际化支持
开发语言·c++·算法
m0_6727033110 小时前
上机练习第51天
数据结构·c++·算法
ArturiaZ10 小时前
【day60】
算法·深度优先·图论