[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;
    }
}
相关推荐
墨雪不会编程2 小时前
数据结构—排序算法篇二
数据结构·算法·排序算法
ShineWinsu2 小时前
对于数据结构:堆的超详细保姆级解析—上
数据结构·c++·算法·计算机·二叉树·顺序表·
im_AMBER3 小时前
Leetcode 46
c语言·c++·笔记·学习·算法·leetcode
努力学算法的蒟蒻3 小时前
day09(11.6)——leetcode面试经典150
算法·leetcode·职场和发展
2301_796512523 小时前
Rust编程学习 - 内存分配机制,如何动态大小类型和 `Sized` trait
学习·算法·rust
卿言卿语4 小时前
CC23-最长的连续元素序列长度
java·算法·哈希算法
天选之女wow5 小时前
【代码随想录算法训练营——Day60】图论——94.城市间货物运输I、95.城市间货物运输II、96.城市间货物运输III
android·算法·图论
Blossom.1185 小时前
大模型在边缘计算中的部署挑战与优化策略
人工智能·python·算法·机器学习·边缘计算·pygame·tornado
时间醉酒5 小时前
数据结构:双向链表-从原理到实战完整指南
c语言·数据结构·算法