贪心算法理论基础 Greedy Algorithm
贪心算法一般分为如下四步:
- 将问题分解为若干个子问题
- 找出适合的贪心策略
- 求解每一个子问题的最优解
- 将局部最优解堆叠成全局最优解
做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了
455.分发饼干
C++解法
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int j = s.size() - 1;
int counter = 0;
for (int i = g.size()-1; i >= 0; i--){
if (j >= 0 && s[j] >= g[i]){
counter++;
j--;
}
}
return counter;
}
};
Python解法
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()
s.sort()
cookie = len(s)-1
counter = 0
for index in range(0, len(g)):
if cookie >= 0 and s[cookie] >= g[len(g) - index - 1]:
counter += 1
cookie -= 1
else:
continue
return counter
376. 摆动序列
C++解法
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if (nums.size() <= 1) return nums.size();
int currDiff = 0;
int prevDiff = 0;
int result = 1;
for (int i = 0; i < nums.size()-1; i++){
currDiff = nums[i+1] - nums[i];
if ((prevDiff <= 0 && currDiff > 0) || (prevDiff >= 0 && currDiff < 0)){
result++;
prevDiff = currDiff;
}
}
return result;
}
};
Python解法
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
if len(nums) <= 1:
return len(nums)
currDiff, prevDiff, result = 0, 0, 1
for i in range(0, len(nums)-1):
currDiff = nums[i+1] - nums[i]
if currDiff * prevDiff <= 0 and currDiff != 0:
result += 1
prevDiff = currDiff
return result
53. 最大子序和
C++解法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int prev_sum = 0;
int result = INT_MIN;
for (int i = 0; i < nums.size(); i++){
if (prev_sum < 0){
prev_sum = nums[i];
} else {
prev_sum += nums[i];
}
result = max(prev_sum, result);
}
return result;
}
};
Python解法
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
count = 0
result = float('-inf')
for num in nums:
count += num
if count > result:
result = count
if count < 0:
count = 0
return result
dp解法
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
dp_sum = [0] * len(nums)
for i in range(len(nums)):
if i == 0:
dp_sum[i] = nums[i]
else:
dp_sum[i] = max(nums[i] + dp_sum[i-1], nums[i])
return max(dp_sum)