首页 > 编程语言 > 详细

LeetCode之用C++写贪心算法

时间:2020-03-12 11:10:18      阅读:91      评论:0      收藏:0      [点我收藏+]

Leetcode #455 分发饼干

题名:分发饼干
描述:
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值?gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj?。如果 sj >= gi?,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

说明:
你可以假设胃口值为正。
一个小朋友最多只能拥有一块饼干。

具体描述请查看Leetcode相关网页:https://leetcode-cn.com/problems/assign-cookies/

方法:贪心

贪心规律

1.某个饼干如果不能满足某个孩子,则该饼干也一定不能满足需求因子更大的孩子
2.某个孩子可以用更小的饼干满足,则没必要用更大饼干满足,因为可以保留更大的饼干
3.孩子的需求因子更小则其更容易被满足,故优先从需求因子小的孩子尝试
4.用某个饼干,满足一个较大需求因子的孩子,或满足一个较小需求因子的孩子,效果是一样的(最终满足的总量不变)

代码如下:


int findContentChildren(vector<int>& g, vector<int>& s) {
        int ans = 0;
        //对孩子的胃口和饼干大小按升序排序,然后依据贪心规律进行模拟
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int p = 0, q = 0;
        while(q < s.size()){
            if(p >= g.size())   break;//p >= g.size() 表示孩子都被满足了但饼干还有的多,此时要退出循环了
            if(s[q] >= g[p]){
                ans++;
                p++;
            }
            q++;
        }
        return ans;
    }

Leetcode #435 无重叠区间

题名:无重叠区间
描述:
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

说明:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。


输入: [ [1,2], [2,3], [3,4], [1,3] ]

输出: 1

解释: 移除 [1,3] 后,剩下的区间没有重叠。

具体描述请查看Leetcode相关网页:https://leetcode-cn.com/problems/non-overlapping-intervals/

方法:贪心

正确的思路其实很简单,可以分为以下三步:

1.在区间集合 intervals 中选择一个区间 x,这个 x 是在当前所有区间中结束最早的(区间右边界最小),因此可以对 intervals 按照单个区间的右边界从小到大排序,例如 [ [1,2], [2,3], [3,4], [1,3] ],经过排序后成为 [ [1,2], [2,3], [1,3], [3,4] ]
2.把所有与 x 区间相交的区间视为有重叠的区间,那么怎么判断相交呢?可以通过区间的左边界,如果后一个区间的左边界值小于前一个区间的右边界值,则视为相交;用
noOverlapCount 用于记录不重叠区间的数量 。
3.重复步骤 1 和 2,直到将 intervals 遍历完为止。然后用用 intervals 中的区间总数减去 noOverlapCount 即是答案;

代码如下:


static bool cmp(vector<int> a, vector<int> b){
        return a[1] < b[1];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(!intervals.size())   return 0;//如果intervals为空啥都不干,返回0即可
        sort(intervals.begin(), intervals.end(), cmp);//步骤1
        int noOverlapCount = 1, index = 0, p = 1;
        while(index + p < intervals.size()){
            if(intervals[index + p][0] >= intervals[index][1]){//步骤2
                noOverlapCount++;
                index += p;
                p = 1;
            }  
            else    p++;
        }
        return intervals.size() - noOverlapCount;//步骤3
    }

LeetCode之用C++写贪心算法

原文:https://www.cnblogs.com/Codroc/p/12467185.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!