贪心算法--常见问题总结

什么是贪心算法?

贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。
贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。

贪心解决问题的基本思路?

1.建立数学模型来描述问题
2.把求解的问题分成若干个子问题
3.对每一子问题求解,得到子问题的局部最优解
4.把子问题对应的局部最优解合成原来整个问题的一个近似最优解

例题

1. 分配饼干
题目描述:每个孩子都有一个满足度,每个饼干都有一个大小,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。
给一个孩子的饼干应当尽量小又能满足该孩子,这样大饼干就能拿来给满足度比较大的孩子。因为最小的孩子最容易得到满足,所以先满足最小的孩子。

/*
    *每个孩子都有一个满足度,每个饼干都有一个大小,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。
    * */
    public int findContentChildren(int[] g, int[] s) {
        /*
        * 思路:将所有 饼干,孩子的愿望 分别从小到大排序。
        * 从小到大遍历每一个孩子的愿望, 按照饼干从小到大的顺序来满足从小到大的孩子的愿望。
        * 判断当前块的饼干是否可以满足孩子的愿望。如果不能(那么后面有更大愿望的孩子就更不能满足了),所以刨除此块,继续用下一块来判断;如果能,则累计count。
        * 直到饼干遍历结束或者孩子的愿望遍历结束。
        * */
        Arrays.sort(g);
        Arrays.sort(s);
        int gi = 0;
        int si = 0;
        int count = 0;
        while (gi < s.length && si < s.length) {
            if (s[si] >= g[gi]) {
                count++;
                gi++;
            }
            si++;
        }
        return count;
    }

2. 不重叠的区间个数
题目描述:计算让一组区间不重叠所需要移除的区间个数

    /*
    * 计算让一组区间不重叠所需要移除的区间个数
    * */
    public int eraseOverlapIntervals(int[][] intervals) {
        /*
        * 思路:让一组区间不重叠,优先选择区间末尾值小的,这样才能让后面的区间最可能不重叠。
        * 换句话说 优先选择区间末尾值小的区间,才能拼接更多的区间,移除更少的区间
        * 做法:
        * a.首先根据区间末尾值由小到大的顺序 将区间排序
        * b.维持一个区间末尾值end
        * c.按照排序后的顺序遍历所有区间,如果当前区间不会与上一个区间重叠(判断方式:当前区间的首值是否大于等于end),就更新end
        * */
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[1] - o2[1];
            }
        });
        int end = Integer.MIN_VALUE;
        int removeCount = 0;
        for (int i = 0; i < intervals.length; i++) {
            if (in
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值