455. 分发饼干(简单)
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int it=0;
int cnt=0;
for(int i=0;i<g.length;i++){
if(it>=s.length)break;
while(it<s.length && s[it]<g[i])it++;
if(it<s.length && s[it]>=g[i]){
it++;
cnt++;
}
}
return cnt;
}
}
376. 摆动序列(中等)
思路:本质上,是计算峰和谷的数量
可以直接去计算峰和谷,也可以交替计算,谷的数量不变的时候,有多少个连续的增加都不会增加峰的数量,对谷同理
// 贪心:计算趋势的变化,diff为0则认为趋势没有变化,延续prediff的趋势
class Solution {
public int wiggleMaxLength(int[] nums) {
int cnt = 1;
int prediff = 0;
for(int i=1;i<nums.length;i++){
int diff = nums[i]-nums[i-1];
if((prediff >= 0 && diff <0) || (prediff <= 0 && diff > 0))cnt++;
if(diff!=0)prediff = diff;
}
return cnt;
}
}
// 优化dp,本质也是计算趋势,s0和s1之间来回倒,
class Solution {
public int wiggleMaxLength(int[] nums) {
int up = 1;
int down = 1;
for(int i=1;i<nums.length;i++){
if(nums[i]>nums[i-1])up = down + 1;
else if(nums[i]<nums[i-1])down = up + 1;
}
return Math.max(up,down);
}
}