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

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

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

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超过了最远抵达位置,那说明出错了,要是循环正常走完了.

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。

代码:

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){//说明当前走到一次边界(上一次最远),再把最远值更新一下,步数+1end=maxPosition;step++;}}return step;}
}---------------------------------------------------------------------

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

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);//重置startstart=end+1;}}return res;}
}
