代码随想录算法训练营第三十一天|理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和

文章目录

  • 理论基础
  • 455.分发饼干
    • 思路
    • 代码
    • 总结
  • 376. 摆动序列
    • 思路
    • 代码
    • 总结
  • 53. 最大子序和
    • 思路
    • 代码
    • 总结

理论基础

贪心的本质是选择每一阶段的局部最优,从而达到全局最优

贪心算法一般分为如下四步:

  1. 将问题分解为若干个子问题
  2. 找出适合的贪心策略
  3. 求解每一个子问题的最优解
  4. 将局部最优解堆叠成全局最优解

贪心算法其实就是没有什么规律可言

455.分发饼干

思路

代码

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(),g,end());
        sort(s.begin(),s.end());
        int index = s.size() - 1;
        int result = 0;
        for(int i = g.size() - 1; i >= 0; i--) {
            if(index >= 0 && s[index] >= g[i]) {
                result++;
                index--;
            }
        }
        return result;
    }
};

总结

  1. 题目比较简单,思路也容易想到,但是在写的时候根本都没感到使用了贪心(这应该就是为什么说贪心是下意识理解题目的

376. 摆动序列

思路

代码

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if(nums.size() <= 1) return nums.size();
        int curDiff = 0;
        int preDiff = 0;
        int result = 1;
        for(int i = 0; i < nums.size() - 1; i++) {
            curDiff = nums[i+1] - nums[i];

            if((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {
                result++;
                preDiff = curDiff;
            }
        }
        return result;
    }
};

总结

53. 最大子序和

思路

贪心贪的是哪里呢?

如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方!

代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result = INT32_MIN;
        int count = 0;
        for(int i = 0; i < nums.size(); i++) {
            count += nums[i];
            if(count > result) {
                result = count;
            }
            if(count <= 0) count = 0;
        }
        return result;
    }
};

总结

你可能感兴趣的:(代码随想录训练营,算法,贪心算法,leetcode)