代码随想录算法训练营Day31 | 贪心算法理论基础,455.分发饼干,376. 摆动序列,53. 最大子序和

贪心算法理论基础 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)
            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值