455. 分发饼干
先用排序把胃口和饼干数组都分别排序好,这样做的目的是我们需要按照胃口的大小去分配饼干。为了不浪费,那么最优的做法应该用最大的饼干去喂能满足的最大的胃口,依次遍历下去。那么这里就需要一个index作为饼干数组的末尾下标(那么s[index]指向的就是最大份的饼干),写判断条件的时候需要注意判断里面index>=0这一条件以避免数组越界。代码如下:
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int index = s.length - 1;
int res = 0;
for(int i = g.length - 1; i >= 0; i --){
if(index>=0 && s[index] >= g[i]){
index --;
res ++;
}
}
return res;
}
}
376. 摆动序列
这题可以用dp做,如果用贪心做的话写完发现代码挺少的但要注意的地方还是蛮多的。题目说要求摆动序列,那么当我们把数字序列大小画出来可以发现,其实就是求这组数列里面如何选出最多个完整的波峰,因为只要出现波峰,就说明俩数之间存在差值,即是题设要求的数组。
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length <= 1) return nums.length;
int count = 1;
int curDiff = 0;
int preDiff = 0;
for(int i = 1; i < nums.length; i ++){
curDiff = nums[i] - nums[i - 1];
//如果出现差值摆动才要更新上一个波峰的差值
if((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)){
count ++;
preDiff = curDiff;
}
//假设上一任的波峰差值是实时更新的,也就是无论是否出现差值都更新,那么当出现平峰时就有可能影响结果
//preDiff = curDiff;
}
return count;
}
}
53. 最大子数组和
class Solution {
public int maxSubArray(int[] nums) {
if (nums.length == 1){
return nums[0];
}
int result = Integer.MIN_VALUE;
int count = 0;
for(int i = 0; i < nums.length; i ++){
count += nums[i];
result = Math.max(result, count);
if(count <= 0) count = 0;
}
return result;
}
}