贪心算法力扣刷题练习(含思路与题解)

贪心算法保证每次操作都是局部最优,使得最终结果也是全局最优的。需要找到贪心的策略,使得每次的最优能保证全局最优。通常需要排序。根据排序需求,自定义比较函数。sort(a.begin(),a.end(),[](vector<int> a,vector<int> b){a[1]>b[1];});技巧:有两种比较时,通常先满足一种,再考虑另一种,如果这两种可以分开,则可以局部最优到全局最优。 题目455,饼干分配问题有一群有不同饥饿度的孩子和一堆不同大小的饼干,每
摘要由CSDN通过智能技术生成

贪心算法

保证每次操作都是局部最优,使得最终结果也是全局最优的。
需要找到贪心的策略,使得每次的最优能保证全局最优。

通常需要排序。根据排序需求,自定义比较函数。

sort(a.begin(),a.end(),[](vector<int> a,vector<int> b){a[1]>b[1];});

技巧:有两种比较时,通常先满足一种,再考虑另一种,如果这两种可以分开,则可以局部最优到全局最优。

  • 题目455,饼干分配问题

有一群有不同饥饿度的孩子和一堆不同大小的饼干,每个孩子只能吃最多一个饼干,且只有饼干的大小大于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩子可以吃饱。

思路:小孩饼干都升序排序,每个小孩吃满足他的最小的饼干

class Solution {
   
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
   
        //都排序后,饼干按从小到大给从小到大的孩子分配
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        int i = 0;//孩子胃口值从小到大排序后 的下标值
        int cnt = 0;
        for(int j=0; j<s.size(); j++){
   
            if(s[j]>=g[i]){
   
                 cnt++; //满足情况分配给孩子,
                 i++;  //继续看下一个孩子  
                 if(i>=g.size())  //孩子分配完
                    return cnt;
            } 
        }
        return cnt;
    }
};
  • 题目135, 糖果分配问题

一群不同评分的孩子站成一排,如果一个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所有孩子至少要有一个糖果。求解最少需要多少个糖果。

思路:小孩都先发一个糖,从左到右遍历,若右边比左边孩子评分高则比左边多分一个,再由右往左遍历,如果左边比右边高,左边加1。

class Solution {
   
public:
    int candy(vector<int>& ratings) {
   
        int len = ratings.size(); 
        int num=0;
        vector<int> candy(len,1); //每个人先确保有一颗 
        for(int i=0; i<len-1; i++){
   
            if(ratings[i+1]>ratings[i])
                candy[i+1] = candy[i] + 1;    //确保右边孩子比左边孩子评分高的 多拿一颗
        }
        for(int i=len-1; i>0; i--){
   
            if(ratings[i-1]>ratings[i]&&candy[i-1]<=candy[i])
                candy[i-1] = candy[i] + 1;    //确保左边孩子比右边孩子评分高的 多拿一颗
            num += candy[i];      
        }
        num += candy[0];
        return num;
    }
};
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值