455. 分发饼干
class Solution {
public int findContentChildren(int[] g, int[] s) {
// 先给两个数组排序
Arrays.sort(g);
Arrays.sort(s);
int j = s.length - 1;
int res = 0; // 记录最终结果
for(int i = g.length - 1; i >= 0; i--){
if( j >=0 && s[j] >= g[i]){
res++;
j--;
}
}
return res;
}
}
376. 摆动序列
链接: 参考讲解
- 遇到的困难
1 平坡的情况很难考虑到,单调平坡的情况也难考虑到
2 一开始没有想到pre只记录波动的情况
class Solution {
public int wiggleMaxLength(int[] a) {
int res = 1;
int pre = 0;
int cur = 0;
if(a.length <=1) return res; // 边界条件
for(int i=0;i<a.length-1;i++){
cur = a[i+1]-a[i];
if((cur > 0 && pre <= 0) || (cur < 0 && pre >= 0)){
res++;
pre = cur; // 有波动就统计,没波动就不统计
}
}
return res;
}
}
53. 最大子序和
链接: 参考讲解
解题关键为,在遍历数组是改变连续和开始的下标,当发现连续和小于0了直接将sum清零,重新开始标记。
看讲解中的动画演示理解会更加深刻
class Solution {
public int maxSubArray(int[] nums) {
int res = Integer.MIN_VALUE;
int sum = 0;
if(nums.length == 1) return nums[0];
for(int x: nums){
sum += x;
res = Math.max(sum, res);
if(sum <= 0) sum = 0; // 如果连续和小于0直接将sum清零
}
return res;
}
}