LeetCode 455 分发饼干
题目链接:455. 分发饼干
【解题思路】
每次都选最大的饼干,尽量喂饱胃口大的小孩
【解题步骤】
-
1.首先将胃口数组与饼干数组进行排序
-
2.新建一个变量记录喂饱了多少个小孩
-
3.定义一个index表示当前饼干的位置
-
4.遍历小孩数组(从大往小遍历):
-
用while(成功投喂之后)遍历饼干数组
-
当我们成功投喂一个小孩,result ++,index --
-
-
-
5.return result
【代码部分】
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int count = 0;//记录喂饱了多少个小孩
int start = s.length - 1;//记录饼干的剩余数量
for(int i = g.length - 1 ; i >= 0 ; i--){//优先考虑胃口大的小孩
if(start >= 0 && g[i] <= s[start]){//如果还有饼干,并且当前饼干能喂饱当前小孩
start --;//饼干-1
count ++;//饱了的小孩+1
}
}
return count;
}
}
LeetCode 376 摆动序列
题目链接:376. 摆动序列
【解题思路】
-
不用真的去做删除操作,我们只需要遇到摆动的时候用count计数器++,统计摆动出现的次数最后返回即可
-
如果找到一个峰值,将峰值的前一个坡度定位prediff,峰值的后一个坡度定为crudiff,如果prediff和crudiff的正负不同,则为一个摆动
-
1.如果相邻元素有相同,即出现平坡的情况,则摆动序列的长度应该为3;可以往左删元素也可以往右删元素,当出现这种情况的时候,prediff == 0,curdiff <0;或者prediff>0,curdiff == 0
-
2.需要对首尾元素进行特殊性判断,当判断首元素的时候,可以将其前面再多加一个相同元素,这样就可以判断是否为摆动了;当判断尾元素时,可以默认尾元素就是一个摆动,这样的话,我们再遍历时就不遍历最后一个元素了
-
3.如果单调坡中有平坡,就会出现错误统计prediff=0,crudiff>0的情况,所以我们当坡度的方向有变化(遇到了一个摆动)的时候prediff才跟着curdiff动,其他情况下如果出现坡度,prediff只记录坡度的方向
【解题步骤】
-
1.如果nums.size = 1,return 1;
-
2.prediff = 0;curdiff = 0;result = 1;
-
3.遍历数组,注意!不用遍历最后一个元素,因为我们默认最后一个元素就为一个摆动了。
-
记录波动:curdiff = nums[i+1] - nums[i]
-
如果prediff >=0 && curdiff < 0或者prediff <=0 && curdiff > 0:
-
result+1
-
往下遍历,将prediff指向当前curdiff的位置,这样prediff就一直跟着curdiff,一直往下判断
-
-
【代码部分】
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length <= 1){
return nums.length;
}
//记录当前差值
int curDiff = 0;
//上一个差值
int preDiff = 0;
//记录摆动次数
int count = 1;
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;
}
}
return count;
}
}
LeetCode 53 最大子序和
题目链接:53. 最大子数组和
【解题思路】
-
当连续和为负数的时候立刻抛弃当前连续和,从下一个数开始遍历
-
注意!是连续和为负数的时候才进行抛弃,而不是遇到负数就抛弃
-
每一次累加后用一个result及时记录出现的最大值
-
遇到累加后大于result的情况才更新result的值
【解题步骤】
-
1.定义一个result记录最大值,初始化为最小值
-
2.定义一个count,记录连续和
-
3.遍历数组:
-
count累加当前位置的元素
-
如果当前的count大于result
-
将count的值赋给result
-
-
如果当前count小于0
-
将count重置为0
-
-
-
-
4.return result
【代码部分】
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(count,result);
if(count <= 0)count = 0;
}
return result;
}
}