第三十天全是Hard的题目,可以跳过,直接来到31天。
455. 这题还是比较简单的,感觉有点双指针的意思,需要注意下循环的终止条件就OK了。
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int count = 0;
int j =0;
// 这里需要注意下循环终止条件就OK了
for(int i=0; i<s.length && j<g.length; i++){
if(s[i] >= g[j]){
count++;
j++;
}
}
return count;
}
}
376. 这道题目呢也不能算难吧,刚开始我的思路是直接算出差值然后原地修改数组的值,但是这样好像很难控制越界问题。看了题解之后,用两个变量pre,cur确实是更加简单直观一点。需要注意count的初始值为1,从i=1开始遍历,diff==0的情况,这道题目建议自己先思考写着再看题解。
class Solution {
public int wiggleMaxLength(int[] nums) {
if (nums.length <= 1) {
return nums.length;
}
int count = 1; // count初始化为1
int curDiff = 0;
int preDiff=0;
for(int i=1; i<nums.length; i++){
//这里需要自己思考一下的
curDiff = nums[i] - nums[i-1];
//这里需要考虑==0的情况不要忘记
if((curDiff>0 && preDiff<=0) || (curDiff<0 && preDiff>=0)){
count++;
preDiff = curDiff;
}
}
return count;
}
}
53. 这题思路有点混乱,先是觉得像是之前做的回溯剪枝,又觉得像是滑动窗口。自己给自己整乱了,看了下题解其实思路跟我想的差不多。但是,需要考虑的就是如何更新区间起点的问题,这里是如果累积的sum为负数了就更新!
class Solution {
public int maxSubArray(int[] nums) {
if(nums.length < 1) return nums[0];
int maxSum = Integer.MIN_VALUE;
int sum = 0;
for(int i=0; i<nums.length; i++){
sum += nums[i];
maxSum = Math.max(maxSum, sum);
//这一步很重要,更新区间起点。
//当sum为负数的时候就会拖累总和所以从新的起点重新累加sum
if(sum <= 0) sum = 0;
}
return maxSum;
}
}