贪心算法理论基础
- 贪心就是选择每一阶段的局部最优,从而达到全局最优
LeetCode 455分发饼干
题目链接:455.分发饼干
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int ans = 0;
for (int i = 0, j = 0; i < g.size() && j < s.size(); ++j) {
if (g[i] <= s[j]) {
++ans;
++i;
}
}
return ans;
}
};
LeetCode 376摆动序列
题目链接:376.摆动序列
- 贪心算法
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
//初始值为1:首【尾】元素
int ans = 1;
int preDiff = 0, curDiff = 0;
for (int i = 0; i < nums.size() - 1; ++i) {
curDiff = nums[i + 1] - nums[i];
//等于0的情况:上下坡中有平坡
if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {
++ans;
preDiff = curDiff;//此句位置:单调坡内部有平坡【1 2 2 2 3 4】
}
}
return ans;
}
};
LeetCode 53最大子序和
题目链接:53.最大子数组和
- 贪心
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = INT_MIN;
int count = 0;
for (int i = 0; i < nums.size(); ++i) {
count += nums[i];
if (count > ans) {
ans = count;
}
if (count < 0) {
count = 0;
}
}
return ans;
}
};
- 动态规划
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = nums[0];
vector<int> dp(nums.size());
dp[0] = nums[0];
for (int i = 1; i < nums.size(); ++i) {
dp[i] = max(nums[i], dp[i - 1] + nums[i]);
ans = max(ans, dp[i]);
}
return ans;
}
};