455.分发饼干
思路一:贪心思路,大饼干先分给大胃口
思路二:小饼干先分给小胃口
376.摆动序列
分析摆动:记 presub 为前面与当前数之差,lastsub 为当前与后面数之差
思路:
- 1.正常摆动时,需要 presub 和 lastsub 同为异号
- 2.出现平路,需要 presub 为0且lastsub不为0时才出现摆动
- 3.单调坡上出现平路时,注意presub的变化,只有当峰值出现presub才改变;如图中所示,不出现峰值时presub不改变,所以平坡的末端处,presub和lastsub是同号的,不会引起计数变化
cpp
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
//思路一:直接计算峰顶和峰底的个数
if(nums.size()<=1) return nums.size();
int curDiff=0;//当前数和后一个数的差值
int preDiff=0;//前一个数和当前数的差值(初始化为0方便第一个元素计算)
int sum=1;
for(int i=0;i<nums.size()-1;i++){
curDiff=nums[i+1]-nums[i];
//出现峰值的情况
if((preDiff<=0 && curDiff>0) || (preDiff>=0 && curDiff<0)){
sum++;
preDiff=curDiff;//峰值出现后更新prediff
}
}
return sum;
}
};
53.最大子序和
思路:直接遍历计算数组和,
当数组和大于最大子序和时,更新最大子序和;
当数组和小于等于0时,直接把数组和记录为0,原地开启下一次求和
注意:存在负数,所以最大子序和的初始值为INT_MIN;(头文件为 #include<limits.h>)
cpp
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
int maxsum=INT_MIN,sum=0;
for(int i=0;i<n;i++){
sum+=nums[i];
if(sum>maxsum)
maxsum=max(maxsum,sum);//更新子序和
if(sum<=0)//重新开始求和
sum=0;
}
return maxsum;
}
};
45.跳跃游戏||
思路:求最少跳跃次数,即需要求最大覆盖范围,并且在覆盖范围内再求最大覆盖范围
1.记录最大覆盖范围
2.在最大覆盖范围内更新最大覆盖范围
3.当走到上一次最大覆盖范围的末尾,判断是否到达了终点;
- 如果没到,则还进行跳跃计数
- 把当前的最大覆盖范围更新
- 判断当前最大覆盖范围是否能到达终点,如果能到达直接跳出(因为这一次跳跃已经计数)
cpp
class Solution {
public:
int jump(vector<int>& nums) {
//思路:在覆盖中寻找跳的最远的
if(nums.size()==1) return 0;
int count=0;
int cur=0,next=0;
for(int i=0;i<nums.size();i++){
next=max(next,nums[i]+i);
if(i==cur){//上一次最大覆盖范围走到末尾
if(cur!=nums.size()-1){//上一次覆盖范围没有到达终点
count++;//进行下一步跳跃计数
cur=next;//更新最大覆盖范围
if(cur>=nums.size()-1) break;//如果最大覆盖范围大于终点
}
}
}
return count;
}
};