2023.4.14 分发饼干
要尽可能满足数量多的孩子,因此我们的饼干尺寸最好与胃口贴合,所以我们可以先将两个数组排序后,从后往前遍历,这样我们就能从最大胃口的孩子和最大尺寸的饼干开始比较。(试想一下,如果不排序的话,可能会有如下情况发生,加入有两个胃口分别为1,2的孩子,而我们的饼干尺寸也为1,2,如果我们使用大的饼干尺寸2去满足小的胃口1,那么剩下一个孩子就不能得到满足。因此,我们必须使用排序后来进行比较才能满足数量最多的孩子。),如果不符合,就继续向前比较。即利用排序加双指针的思想。
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
//两个指针从后往前遍历
int i = g.length-1;
int j = s.length-1;
int count = 0;
while(i >= 0 && j >= 0){
if(g[i]<=s[j]){//满足分配规则
count++;
i--;
j--;
}
else{//饼干尺寸不够,看看前一个孩子的胃口。
i--;
}
}
return count;
}
}
2023.4.14 摆动序列
根绝题目要求,摆动序列是要求连续两个相邻数之间的差一个为正一个为负的,因此我们需要一个变量去记录前两个数的差,另一个变量去记录当前两个数的差。如果将数的大小展示在一个图上,那么摆动序列的示意就是相邻的一个上坡一个下坡,注意,如果出现了连续的上坡或者下坡只能记录一次,此外,平路也是不能被记录的。
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length == 1){
return 1;
}
if(nums.length == 2 && nums[0] != nums[1]){
return 2;
}
int count = 1;
int pre = 0;
int cur = 0;
for(int i = 0;i<nums.length-1;i++){
cur = nums[i+1] - nums[i];
//注意:实际上,pre在后续的判断中是不能为0的,因为为0代表了平路,而我们的摆动是不会记录平路的,之所以为0是因为我们的第一次初始值默认为0,在后续的判断中pre不会再为0.
if((pre >= 0 && cur<0) ||(pre <=0 && cur >0)){//满足条件,更新pre和count;
count++;
//当不满足条件,比如cur=0,代表为平路,是不会进入当前条件判断的,因此pre在后续的判断中永远不会为0
pre = cur;
}
}
return count;
}
}
2023.4.14 最大连续子数组
本题使用贪心的思路:我们从数组头开始记录连续子数组和,如果当前和为负数,那么就舍去这个和,因为负数会减小我们的最终结果,我们从后一位重新计算,只要当当前连续数组和大于0了,我们就往后加,并不断更新最大值。直到到达了数组末尾。
class Solution {
public int maxSubArray(int[] nums) {
int maxSum = Integer.MIN_VALUE;
int curSum = 0;
for(int i = 0;i<nums.length;i++){
curSum +=nums[i];
maxSum = Math.max(maxSum,curSum);
if(curSum < 0){
curSum = 0;
}
}
return maxSum;
}
}