今天开始刷贪心算法的部分题:
分发饼干455

一定要理清题意:刚开始我还以为一块饼干可以分成好几小份,给不同胃口的孩子们吃。后面才发现是自己理解错题意了,那肯定是一块饼干就给一个小孩吃。思路就是:将尺寸大的饼干先给胃口大的孩子吃,如果给胃口小的孩子吃了,那这块饼干不就浪费了嘛,通过这样能发现这样找局部最优,最后能找到全局最优,无法提供反例,所以这是一道贪心算法类的题。代码如下:
class Solution {
public int findContentChildren(int[] g, int[] s) {
//1.首先对小孩和胃口排序
Arrays.sort(g);
Arrays.sort(s);
//2.优先考虑胃口:大饼干投喂给胃口大的孩子
int result=0;
int index = s.length -1;
//后序遍历孩子
for(int i = g.length -1; i >=0; i--){
if(index >= 0 && s[index] >= g[i]){
index--;
result++;
}
}
return result;
}
}
摆动序列376

本题异常情况的本质,就是要考虑平坡, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡,如图:

所以不是每次循环都要更新prediff:
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length <= 1) return nums.length;
int curDiff = 0;//当前差值,当前这个数与前面的数的差值
int preDiff = 0;//上一个差值
int count = 1;
//直接从第二个数开始
for(int i = 1; i < nums.length; i++){
curDiff = nums[i] - nums[i-1];
if(curDiff > 0 && preDiff <= 0 || curDiff < 0 && preDiff >= 0){
count++;
preDiff = curDiff;
}
}
return count;
}
}
买卖股票的最佳时机II122

直接将最终利润拆分为每次的利润,然后只收集每天的正利润就可以得到最大利润了。
class Solution {
public int maxProfit(int[] prices) {
int result = 0;
for(int i = 1; i < prices.length; i++){
result += Math.max(prices[i]-prices[i-1],0);
}
return result;
}
}

被折叠的 条评论
为什么被折叠?



