Day31 | 455.分发饼干, 376. 摆动序列, 53. 最大子序和
分发饼干
LeetCode题目:https://leetcode.cn/problems/assign-cookies/
整体思路
本题很简单,排序就能过。
代码如下:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int j = 0;
for(int i =0;i<s.size();i++){
if(j>=g.size()) break;
if(s[i]>=g[j]) j++;
}
return j;
}
};
摆动序列
LeetCode题目:https://leetcode.cn/problems/wiggle-subsequence/
解题思路
主要思路在于同时维护当前节点的上一段差值和下一段差值,如果正负相反则可以将计数器加一,同时,考虑到题中所描述的两个不同的值构成的序列可以看做是摆动序列。且仅有两个值的时候无法满足当前的逻辑,因此,假定前侧有个虚拟节点与头结点值相等。即prediff = 0。同时,在以上设计,其实可以看做求的是满足要求的diff值的个数,因此序列长度初始值设定为1。才能得到正确值。
可以把思想抽象成一个链表来进行贪心算法。去掉节点的操作可以抽象为如果不满足要求,就跳过当前操作的节点进行下一个节点。
代码如下:
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size()==1) return 1;
int numLen=1;
int currdiff=0,prediff=0;
for(int i=0;i<nums.size()-1;i++){
currdiff = nums[i+1] - nums[i];
if((prediff>=0&&currdiff<0)||(prediff<=0&&currdiff>0)){
numLen++;
prediff = currdiff;
}
}
return numLen;
}
};
最大子序和
LeetCode题目:https://leetcode.cn/problems/assign-cookies/
解题思路
可以看做另类的求前缀和方式,来完成局部最优:如果当前sum值小于0,那么说明前面的值无法为最大子序和提供贡献,因此跳过。同时,考虑到存在子序和最大,但是后期出现负数抵消,导致最后的sum不是最大的情况,需要一个额外变量来维护sum的最大值。
代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum = 0,result = INT_MIN;
for(int i=0;i<nums.size();i++){
sum+=nums[i];
if(result<sum) result = sum;
if(sum<0){
sum = 0;
continue;
}
}
return result;
}
};