这道题就是一个很显然的贪心,每次选择尽可能小的饼干去喂,避免浪费,以满足后续更大胃口的孩子
当然,排序不能忘记
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(s.begin(),s.end());
sort(g.begin(),g.end());
int idx_s = 0;
int res = 0;
for(int i = 0;i< g.size();i++){
while(idx_s < s.size()){
if(s[idx_s++] >= g[i]){
res++;
break;
}
}
if(idx_s == s.size()){
return res;
}
}
return res;
}
};
这道题的需要找最长的正负差值交替的序列,需要注意初始的边界条件,比如若干数值,但差值全为0的情况等
有平坡的情况:
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size() <= 1){
return nums.size();
}
int res = 1;
int prediff = 0;
int curdiff = 0;
for(int i = 0;i< nums.size()-1;i++){
int curdiff = nums[i] - nums[i+1];
if((prediff >= 0 && curdiff < 0) || (prediff <= 0 && curdiff > 0)){
res++;
prediff = curdiff;
}
}
return res;
}
};
典型的dp问题
class Solution {
public:
vector<int> dp;
void resInit(vector<int>& nums){
vector<int> dpTem(nums.size(),INT_MIN);
dp = dpTem;
}
int maxSubArray(vector<int>& nums) {
resInit(nums);
//base case
dp[0] = nums[0];
//dp[i] 以下标i为结尾的连续子数组的最大和
for(int i = 1;i< nums.size();i++){
dp[i] = max(dp[i-1] + nums[i],nums[i]);
}
sort(dp.begin(),dp.end());
return dp[nums.size()-1];
}
};