455. 分发饼干
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int result = 0, j = g.size() - 1;
sort(g.begin(), g.end());
sort(s.begin(), s.end());
for (int i = s.size() - 1; i >= 0; i--) {
while (j >= 0 && g[j] > s[i]) {
j--;
}
if (j < 0)
return result;
result++;
j--;
}
return result;
}
};
从最大的饼干出发,分配给最大胃口的孩子是最贪心的策略,累加分配个数,直至孩子/饼干被处理完。
376. 摆动序列
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
vector<vector<int>> dp(nums.size(),vector<int>(2,1));
//dp[i][0] 以nums[i]为波峰收尾的最长子序列长度
for(int i=1; i<nums.size(); i++){
for(int j=0; j<i; j++){
if(nums[i]>nums[j])
dp[i][0]=max(dp[i][0],dp[j][1]+1);
}
for(int j=0; j<i; j++){
if(nums[i]<nums[j])
dp[i][1]=max(dp[i][1],dp[j][0]+1);
}
}
return *max_element(dp.back().begin(),dp.back().end());
}
};
二维dp,列表示波谷波峰状态:
dp[i][0]表示以nums[i]结尾并且为波峰的最长子序列长度;
dp[i][1]表示以nums[i]结尾并且为波谷的最长子序列长度。
因为是子序列问题,所以计算第i位要遍历前置所有的节点,累计最大值。
max_element返回的是迭代器,解引用后才是数值。
53. 最大子数组和
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> dp=nums;
int max_num=dp[0];
for(int i=1; i<nums.size(); i++){
if(dp[i-1]>0)
dp[i]+=dp[i-1];
max_num=max(max_num,dp[i]);
}
return max_num;
}
};
dp[i]表示以nums[i]结尾的子数组(要求连续)的最大和,分析转移方程只可能有两种情况:
1.不使用i之前的数字,此时dp[i]=nums[i] ;
2.使用i之前的数字,此时dp[i]=dp[i-1]+nums[i]