455. 分发饼干
解题思路
饼干和胃口,胃口一定要<=
饼干,所以小胃口吃小饼干,大胃口吃大饼干,所以把他们先排序,从小到大看饼干能塞到哪个胃口里,即是满足最大的个数。
代码
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
if (g.empty() || s.empty()) return 0;
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int res = 0;
for (int i = 0, j = 0; i < s.size(); i ++){
if( j < g.size() && g[j] <= s[i]){ // 胃口
res++;
j ++;
}
}
return res;
}
};
376. 摆动序列
思路
- 贪心:单调区间去除多余的,考虑如果上下破有平坡,前和后的问题
- 动态规划:
dp[]
定义为以i
结尾的数字摆动序列最大值,所以结尾要么是山谷要么是山峰
代码
- 贪心
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int res = 1;
int pre = 0;
int cur = 0;
for (int i = 1; i < nums.size(); i ++){
cur = nums[i] - nums[i - 1];
if ((cur > 0 && pre <= 0) || (cur < 0 && pre >= 0)){
res ++;
pre = cur;
}
}
return res;
}
};
- 动态规划
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> f(n, vector<int> (2, 0));
f[0][0] = f[0][1] = 1; // 0 为山谷 1 为山峰
for (int i = 1; i < n; i ++){
f[i][0] = f[i][1] = 1;
for (int j = 0; j < i; j ++){
if (nums[j] < nums[i]) f[i][1] = max(f[i][1], f[j][0] + 1);
if (nums[j] > nums[i]) f[i][0] = max(f[i][0], f[j][1] + 1);
}
}
return max(f[n - 1][0], f[n - 1][1]);
}
};
53. 最大子数组和
解题思路
- 动态规划:
dp
为以i
结尾的连续数组的最大值 - 贪心:只要是相加的和为负数,说明要重新开始计数
代码
- 动态规划
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> f(nums.size(), 0);
f[0] = nums[0];
int res = nums[0];
for (int i = 1; i < nums.size(); i ++){
f[i] = nums[i];
f[i] = max(f[i - 1] + nums[i], f[i]);
res = max(res, f[i]);
}
return res;
}
};
- 贪心
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int count = 0;
int result = INT_MIN;
for (int i = 0; i < nums.size(); i ++){
count += nums[i];
if (count > result) result = count;
if (count <= 0) count = 0;
}
return result;
}
};