455. 分发饼干
思路:既然要满足最多的小孩吃到饼干,那么肯定优先满足胃口小的更能满足最多的。因此,先对两个数组排序。每次选择最小的能满足当前孩子的饼干。
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int i_g = 0, i_s = 0;
int cnt = 0;
while(i_g < g.length && i_s < s.length){
if( g[i_g] <= s[i_s]) {
cnt++;
i_g++; i_s++;
}else{
i_s++;
}
}
return cnt;
}
}
376. 摆动序列
这个思路是抄一个题解的,简单说一下吧。这里最终返回的结果可以看作是变化的次数。若上一次遍历是上升,这次遍历是下降,则结果加一;若上一次下降,这次上升,结果加一;其他的几种情况,例如上次上升,这次继续上升,上次下降这次继续下降,以及没有发生变化,则不统计。
这个思路与官解中贪心的解法是一致的,不过更好理解。
class Solution {
public int wiggleMaxLength(int[] nums) {
int cnt = 1;
int sign = -1; //sign == 0 代表前一个小于后一个(也就是上升) == 1代表大于后一个(下降)
for(int i = 0; i < nums.length - 1; i++){
if(nums[i] - nums[i+1] == 0) continue; //== 0 代表既不是上升也不是下降,因此可以删除
else if(nums[i] - nums[i+1] > 0){
if(sign != 1){ cnt++; sign = 1;} //若前一次遍历时不是下降,说明找到了峰(找到了上升趋势)
}else{
if(sign != 0) { cnt++; sign = 0; } //同理
}
}
return cnt;
}
}
53. 最大子数组和
class Solution {
public int maxSubArray(int[] nums) {
int max = nums[0];
int sum = 0;
for(int i = 0; i < nums.length; i++){
if(sum < 0) sum = 0;
sum += nums[i];
max = Math.max(max, sum);
}
return max;
}
}
标签:cnt,27,nums,Part01,max,sum,sign,int,Day
From: https://www.cnblogs.com/12sleep/p/18330932