• leetcode 452 用最少数量的箭引爆气球 贪心算法


     贪心算法一共有两类问题:

    • 1、苹果数量一定,求最多能满足多少个孩子
    • 2、孩子数量一定(要满足某一固定目标),求最少需要多少个苹果。(leetcode 455)

    总之,贪心算法就是一个变量一定,求另一个变量最多或者最少值。

    官方的说法是贪心算法一般用来解决需要 “找到要做某事的最小数量” 或 “找到在某些情况下适合的最大物品数量” 的问题,且提供的是无序的输入。

    两种问题采用贪心算法的合理性:

    • 1、解决方法是尽量用小苹果去满足小胃口孩子,不浪费大苹果,因为大苹果可以用于去满足胃口大的孩子,如果用大苹果去满足胃口小的孩子有可能会出现胃口大的孩子得不到满足,无法实现全局最优。
    • 2、解决方法是在满足胃口范围的情况下,尽量用一个苹果去满足多个孩子,因为要求务必所有孩子都要得到满足,所以在满足第一个孩子的同时,看看最多能用第一个苹果同时还满足其他几个孩子,这样满足的孩子越多,后面会用到的苹果就会越少,就越能实现全局最优。

    注意:

    1、如何对一个二维数组按照一定规则进行排序,如按照最后一位进行排序。注意下面用的是匿名函数的写法

    Arrays.sort(points, new Comparatoe<int[]>(){//传进二维数组
        @Override
        public int compare(int[] o1,int[]o2){//参数是一维数组
        return o1[1]-o2[1];//计算二维数组第二维的差值,如果小于0则说明前面的小,排在前面
    }
    })

    2、注意本题中二维数组的循环方法,是用二维数组中的一维地址进行遍历

    代码:

    class Solution {
        public int findMinArrowShots(int[][] points) {
            if(points.length==0) return 0;
            Arrays.sort(points,new Comparator<int[]>(){//注意这里的大小写,因为是类名所以大写
                @Override
                public int compare(int[]o1,int[]o2){
                    return o1[1]-o2[1];
                }
            });//注意这里要有分号,不要忘记写,因为这里也是一行语句。
            int count=1;
            int startx,endx,endv=points[0][1];//注意这里二维数组的索引方式,容易写错!!
            for(int[] p:points){
                startx=p[0];
                endx=p[1];
                if(startx>endv){
                    count++;
                    endv=p[1];
                }
            }
            return count;
    } }
  • 相关阅读:
    Hadoop、spark
    Hadoop、spark
    Hadoop、spark
    Hadoop、spark
    SQL查询表中的用那些索引
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    【转】迷你区块链(mini blockchain in python)
    理解 Web 3
    【转】数字货币钱包:生态及技术
    【转】用 Witnet 协议使加密网络可以跨链访问
  • 原文地址:https://www.cnblogs.com/sjh-dora/p/12868248.html
Copyright © 2020-2023  润新知