455.分发饼干
思路:
两种思路,一种是饼干优先给胃口小的孩子,另一种是胃口大的孩子先吃大饼干。
代码:
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int res = 0;
int index = 0;
for(int i = 0; i < s.length; i++){//遍历饼干
if(index < g.length && s[i] >= g[index]){
res++;
index++;//喂饱一个,转向下一个孩子
}
}
return res;
}
}
需要注意的点:
1、不需要两层循环,只需要一个index记录孩子或者饼干,满足条件后转向下一个。
376. 摆动序列
思路:
用一个变量记录前一对数的差值,并与后一对差值比较,正负相反的话说明摆动序列长度+1
代码:
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length == 1) return 1;
int cur = 0;//目前两个数的差
int pre = 0;//上两个数的差
int res = 1;//至少2个数,从1开始算
for(int i = 1; i < nums.length; i++){
cur = nums[i] - nums[i - 1];
//差的正负情况相反时res+1,pre记录现在的cur
//pre=0是将初始pre考虑在内
if((cur > 0 && pre <= 0) || (cur < 0 && pre >= 0)){
res++;
pre = cur;
}
}
return res;
}
}
需要注意的点:
1、pre初始设置为0,所以在差值正负比较时将pre=0考虑在内。
2、初始res要为1,视两个数差值情况决定是否+1.
53. 最大子序和
思路:
遍历nums,从头开始用count累积,如果count一旦加上nums[i]变为负数,那么就应该从nums[i+1]开始从0累积count了,因为已经变为负数的count,只会拖累总和
代码:
class Solution {
public int maxSubArray(int[] nums) {
if(nums.length == 1) return nums[0];
int count = 0;
int res = Integer.MIN_VALUE;
for(int i = 0; i < nums.length; i++){
count+=nums[i];
res = Math.max(count, res);//先记录每一步的连续序列的最大和
//当现在的和为负数时就清零重新开始计算
//因为现在的负数如果继续累计会减小
if(count <= 0){
count = 0;
}
}
return res;
}
}
需要注意的点:
1、先记录,在进行清零还是继续累计的判断。
2、核心思想就是当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。