455. 分发饼干
思路: 每个孩子有一个胃口,每个饼干有尺寸,要满足尽可能多的孩子
用贪心的思想,局部最优达到全局最优,局部最优就是大饼干可以满足小胃口孩子,也可以满足大胃口孩子,那么就让饼干尽可能满足胃口最接近的孩子
胃口排序,饼干排序,倒着遍历胃口,(倒着遍历饼干)如果饼干大于胃口,就计数,饼干遍历,否则就自动遍历胃口
int k=s.length-1;
for(int i=g.length-1;i>=0;i--) {
if(k>=0 && s[k] >= g[i]){
count++;
k--;
}
}
还有一个想法是从小到大遍历,小饼干先满足小胃口
int k = 0;
for(int i=0;i<s.length;i++) {
if(k<g.length && s[i] >= g[k]) k++;
}
遍历饼干,如果饼干不小于胃口,就胃口k++,最后k就是数量
376. 摆动序列
题目链接:376. 摆动序列 - 力扣(LeetCode)
思路: 摆动序列就是一个山峰一个山谷,一个山峰一个山谷,可以删除元素
记录前一对差值,后一对差值,如果前一对小于0,后一对》0,或者前一对大于0,后一对《0,就说明遇到极值,就+1
但是考虑到初始情况为0,就if((prediff <=0 && curdiff > 0) || (prediff >=0 && curdiff < 0))
prediff什么时候为0?最开始时,遇到平地时,遇到平地时这个条件不符合,prediff从何而来,除了最开始的0,后面都是curdiff造的,只有在遇到坡度变化时才赋值给prediff
public int wiggleMaxLength(int[] nums) {
if(nums.length <=1)return nums.length;
int result = 1;
int prediff = 0;
int curdiff = 0;
for(int i=0;i<nums.length-1;i++) {
curdiff = nums[i+1] - nums[i];
if((prediff <=0 && curdiff > 0) || (prediff >=0 && curdiff < 0)) {
result ++;
prediff = curdiff;
}
}
return result;
}
53. 最大子数组和
题目链接:53. 最大子数组和 - 力扣(LeetCode)
思路:求最大子数组和,用贪心思想,我让每新加一个数的子数组都最大,如果此时和《0,就舍弃 了,因为负数只会让和变小
public int maxSubArray(int[] nums) {
int max = -10011;
int sum = 0;
for(int i=0;i<nums.length;i++) {
sum += nums[i];
if(sum > max) max = sum;
if(sum < 0) {
sum = 0;
}
}
return max;
}