1.基础知识
这一部分相关的题,代码部分其实都很简单,但是解题思路非常精妙。
2.刷题
455.分发饼干
思路:大饼干优先分给食量大的人,同时要注意边界条件
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int result=0;
sort(g.begin(),g.end());
sort(s.begin(),s.end());
for(int i=s.size()-1,j=g.size()-1;i>=0&&j>=0;i--){
while(s[i]<g[j]&&j>0){
j--;
}
if(s[i]>=g[j]){
result++;
j--;
}
}
return result;
}
};
376.摆动序列
思路:值不变、单调的增减点都去掉
1.curdiff=0,要去掉。
2.prediif只需要记录未被删去的点,否则会影响判断。
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int curdiif = 0;
int prediff=0;
int result = 1;
if (nums.size() > 1) {
for (int i = 1; i < nums.size(); i++) {
curdiif = nums[i] - nums[i - 1];
if ((curdiif > 0 && prediff <= 0) ||(curdiif < 0 && prediff >= 0)) {
result++;
prediff = curdiif;
} else
continue;
}
}
return result;
}
};
53.最大子序和
思路:
- 当count<=0时,就重新累加,因为此时前面的序列只会拖垮后面的值,不如重新开始计数。
- 如果出现更大的累加和,就用它替换result。
- 初试值的设定很重要,最开始默认result=nums[0],等于默认将nums[0]加入到数组中。例如{-2,1}就会得到错误答案-1,正确答案1。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int count=0;
//注意这里result初始数值的设置
int result=INT_MIN;
for(int i=0;i<nums.size();i++){
count+=nums[i];
if(count>result){
result=count;
}
if(count<=0){
count=0;}
}
return result;
}
};
55.跳跃游戏
思路:每走一步棋,可移动范围就改变了,变为nums[i]+i,这样就能遍历到最大可移动范围,某一步nums[i]+i>=nums.size()-1时,就能够走到终点。如果最后可移动范围仍旧小于nums.size()-1,那么就返回false。
class Solution {
public:
bool canJump(vector<int>& nums) {
int maxposition=0;
int curposition=0;
if(nums.size()==0)return true;
//注意这里,maxposition的设置是巧妙地,可移动范围是可以改变的
for(int i=0;i<=maxposition;i++){
curposition=nums[i]+i;
if(curposition>=nums.size()-1){
return true;
}
if(curposition>maxposition){