算法学习【贪心算法】(基础)


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

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

分发饼干

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) &#123;
        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--)&#123;
            if(index>=0&&s[index]>=g[i])&#123;
                result++;
                index--;
            &#125;
        &#125;
        return result;
    &#125;
&#125;;

摆动序列

class Solution &#123;
public:
    int wiggleMaxLength(vector<int>& nums) &#123;
      if(nums.size()==0) return 0;
      if(nums.size()==1) return 1;
      
      int prediff=0;
      int curdiff=0;
      int cnt=1;
      for(int i=1;i<nums.size();i++)&#123;
        curdiff=nums[i]-nums[i-1];
        if((prediff>=0&&curdiff<0)||(prediff<=0&&curdiff>0))&#123;
          cnt++;
          prediff = curdiff;
          //cout<<curdiff<<endl;
        &#125;
      &#125;
      return cnt;
    &#125;
&#125;;

最大子序和

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

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

全局最优:选取最大“连续和”

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

买卖股票的最佳时机II

局部最优:收集每天的正利润,全局最优:求得最大利润

class Solution &#123;
public:
    int maxProfit(vector<int>& prices) &#123;
        int result = 0;
        for (int i = 1; i < prices.size(); i++) &#123;
            result += max(prices[i] - prices[i - 1], 0);
        &#125;
        return result;
    &#125;
&#125;;

文章作者: Turboost Chen
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Turboost Chen !
  目录