• letcode每日一题-用最少数量的箭引爆气球


    愉快的周末结束啦,今日每日一题中等难度,虽然写出来了,但是没有官网的运行速度快,来记录啦!!!

    题目描述:

    先来记录一下我的做题思路和代码吧:
    思路:如果两个气球能同时被戳破,则这两个气球的位置坐标必然有重合的地方,所以我们可以计算他们的重合坐标
    。但是在现在这个乱序的情况下,计算公共坐标还需要存储计算出来的重合坐标啊,防止后续又需要使用,为了防
    止这个情况,我们先对数组进行排序。然后再计算重合坐标。代码如下:

        public int findMinArrowShots(int[][] points) {
            if(points.length==0){
                return 0;
            }
            Arrays.sort(points,(a,b)->{
                if(a[0]<b[0]){
                    return -1;
                }
                if(a[0]>b[0]){
                    return 1;
                }
                return 0;
            });
            int result=1;
            int[] tmpIndex=points[0];
            for(int i=1;i<points.length;i++){
                if(tmpIndex[1]>=points[i][0]){
                    //计算重合坐标
                    tmpIndex[0]=Math.max(tmpIndex[0],points[i][0]);
                    tmpIndex[1]=Math.min(tmpIndex[1],points[i][1]);
                    continue;
                }
                result++;
                tmpIndex=points[i];
            }
            return result;
        }
    
    

    运行速度如下:

    这速度果然感人,所以我决定再去官网学习一下,果然还是有很大的优化之处:

    如图 1-1 所示,我们随机射出一支箭,引爆了除红色气球以外的所有气球。我们称所有引爆的气球为「原本引爆的气球」,其余的气球为「原本完好的气球」。可以发现,如果我们将这支箭的射出位置稍微往右移动一点,那么我们就有机会引爆红色气球,如图 1-2 所示。

    那么我们最远可以将这支箭往右移动多远呢?我们唯一的要求就是:原本引爆的气球只要仍然被引爆就行了。这样一来,我们找出原本引爆的气球中右边界位置最靠左的那一个,将这支箭的射出位置移动到这个右边界位置,这也是最远可以往右移动到的位置:如图 1-3 所示,只要我们再往右移动一点点,这个气球就无法被引爆了。

    所以这里我们只需要把这些气球数组,按照右边界进行排序,然后计算就可以了,代码如下:

        public int findMinArrowShots(int[][] points) {
            if(points.length==0){
                return 0;
            }
            Arrays.sort(points,(a,b)->{
                if(a[1]<b[1]){
                    return -1;
                }
                if(a[1]>b[1]){
                    return 1;
                }
                return 0;
            });
            int result=1;
            int rightMin=points[0][1];
            for(int i=1;i<points.length;i++){
                if(points[i][0]>rightMin){
                    result++;
                    rightMin=points[i][1];
                }
            }
            return result;
        }
    
    

    总结:
    1.相同的需求,好的思路可以令其在应用的时候响应速度提升数倍,这对于用户来说体验感也会好很多,所以还是要加油啊,不能为了写代码而
    写代码,我们要写出高效,简洁,可维护性好,扩展性高的代码
    2.按照数据大小排序的时候最好直接进行比较,而非进行减法,一方面是速度更快,另一方面是为了防止越界问题。如:最小负数-正数必然是
    越界的,返回一个正数,就好导致排序出现错误,要多注意

  • 相关阅读:
    PHP概率算法---砸金蛋示例
    onethink----网站配置信息调用!
    ajax解决跨域方法(适用于自己写接口解决跨域)
    JavaScript获取地址栏的参数!
    Atitit. null错误的设计 使用Optional来处理null
    Atitit.常用的gc算法
    Atitit.java expression fsm 表达式分词fsm引擎
    Atitit.安全性方案规划设计4gm  v1 q928
    Atitit.安全性方案规划设计4gm  v1 q928
    Atitit.java expression fsm 表达式分词fsm引擎
  • 原文地址:https://www.cnblogs.com/MissWX/p/14023215.html
Copyright © 2020-2023  润新知