算法训练营day31_贪心算法(3.3)
455.分发饼干
小饼干尽量分给小胃口,大饼干尽量分给大胃王;
所以把俩数组排序,遍历胃口,里面放个双指针指向饼干;
直到最大的饼干也遍历过,退出循环;
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int res=0,j=0;
for(int i=0,j=0;i<g.size();i++){
while(j<s.size()&&s[j]<g[i]) j++;
if(j==s.size()) break;
res++;
j++;
}
return res;
}
};
376.摆动序列
刚开始没看清题,以为是连续子序列,后来才看到;
记录前差,for循环看现差,达条件了更新前差;用一个达不到的标记数来初始化前差,刚开始用-1标记踩坑了;
**随想录思路:**直接前差初始化为0,这样第一个前差为正数也可以更新,为负数也可以更新,不用我这么麻烦;
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int n=nums.size();
if(n<=1) return n;
if(n==2){
if(nums[0]!=nums[1]) return 2;
return 1;
}
int pre=-1111,cnt=1;
for(int i=1;i<n;i++){
if(pre==-1111){
if(nums[i]!=nums[i-1]){
cnt++;
pre=nums[i]-nums[i-1];
}
}
else{
if(pre<=0&&nums[i]-nums[i-1]>0||pre>=0&&nums[i]-nums[i-1]<0){
cnt++;
pre=nums[i]-nums[i-1];
}
}
}
return cnt;
}
};
53.最大子数组和
只要前面一坨<0,就不要前面这坨,直接从当前数开始;遍历一遍即可;
不断更新ans;
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
int ans=-1e5,sum=0;
for(int i=0;i<n;i++){
sum+=nums[i];
ans=max(sum,ans);
if(sum<0) sum=0;
}
return ans;
}
};