Day31
455.分发饼干
下面是两种遍历数组的两种方式,区别在于一个是遍历胃口,一个是遍历饼干
遍历胃口时,,最后肯定是所以大饼干的全部被吃,所以要注意所有饼干已经被吃但是胃口还没有遍历结束的情况,所以加上num>0。
遍历饼干时,优先满足所有小胃口,这时候就要注意胃口全部被满足但是饼干还有剩的情况,所以要加上num<g.size()。
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int num=s.size()-1;
int result=0;
for(int i=g.size()-1;i>=0;i--){
if(num>=0&&g[i]<=s[num]){
num--;
result++;
}
}
return result;
}
};
遍历胃口
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int num=0;
for(int i=0;i<s.size();i++){
if(num<g.size()&&g[num]<=s[i]){
num++;
}
}
return num;
}
};
遍历饼干
376. 摆动序列
摆动序列主要考虑有平坡的时候怎么处理,一个是上下有平坡,这时候考虑要哪个点(因为中间有很多平点,所以要最左边或者最右边都可以),还有就是数组长度为2的时候考虑数组两端,其实也是把curDiff或者preDiff为0的情况考虑进去即可。
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size()<=0) return 0;
int curDiff=0;
int preDiff=0;
int result=1;
for(int i=0;i<nums.size()-1;i++){
int curDiff=nums[i+1]-nums[i];
if((preDiff<=0&&curDiff>0) || (preDiff>=0&&curDiff<0)){
result++;
preDiff=curDiff;
}
}
return result;
}
};
53. 最大子序和
思路是贪心只要前面和>0,那么加上后面一定比单独的后面要大,当<0的时候直接从下一数字开始就行,
当时考虑会不会出现加上前面的某一些数字会更大,但实际不会,因为按照这个贪心策略,第一个数字一定是>0的,去掉这个只会更小。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result=INT32_MIN;
int count=0;
for(int i=0;i<nums.size();i++){
count+=nums[i];
if(count>result) result=count;
if(count<0) count=0;
}
return result;
}
};