贪心算法:LeetCode:455. 分发饼干 135. 分发糖果 435. 无重叠区间

  1. 分发饼干

这题分配饼干的大小与小孩的饥饿程度有关,饥饿度更小的小孩更容易吃饱,所以考虑先满足饥饿度更小的小孩;首先对g和s排序,再从左往右遍历,当满足对应小孩时将饼干分配出去,不满足时找下一个饼干

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        int child = 0;
        int cookie = 0;
        while(child < g.size()&& cookie < s.size())
        {
            if(g[child] <= s[cookie])
            {
                ++child;
            }
            ++cookie;
        }
        return child;
    }
};
  1. 分发糖果

这题每个小孩至少分配到一个糖果,所以新分配一个初始化为1的数组表示每个小孩最小分配到的糖果数,首先从左往右找,如果后一个小孩的评分数比前一个更高,则将后一个小孩的糖果数加1;接着从右往左遍历,如果前一个小孩评分数比后一个更高,且前一个小孩的糖果数比后一个的少,则将前一个小孩的糖果数加1;最后直接用函数accumulate函数求糖果数总和。

class Solution {
public:
    int candy(vector<int>& ratings) 
    {
        int size = ratings.size();
        if (size < 2) 
        {
            return size;
        }
        vector<int> num(size, 1);//定义一个新数组初始化成1,表示每个孩子至少分到1个糖果
        for (int i = 1; i < size; ++i)//从左往右遍历
        {
            if (ratings[i] > ratings[i-1]) //后一个小孩比前一个表现更好
            {
                num[i] = num[i-1] + 1;
            }
        }
        for (int i = size - 1; i > 0; --i) //从右往左遍历
        {
            if (ratings[i] < ratings[i-1]) 
            {
                num[i-1] = max(num[i-1], num[i] + 1);
            }
        }
        return accumulate(num.begin(),num.end(),0); //std::accumulate 可以很方便地求和
    }
};
  1. 无重叠区间
    在这里插入图片描述
class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if (intervals.empty()) 
        {
            return 0;
        }
        int n = intervals.size();
        sort(intervals.begin(), intervals.end(), [](vector<int> a, vector<int> b) {return a[1] < b[1];});//对intervals排序
        int total = 0, prev = intervals[0][1];
        for (int i = 1; i < n; ++i) 
        {
            if (intervals[i][0] < prev) 
            {
                ++total;
            } 
            else 
            {
                prev = intervals[i][1];
            }
        }
        return total;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值