Day 35 | 860.柠檬水找零 & 406.根据身高重建队列 & 452. 用最少数量的箭引爆气球

860.柠檬水找零

Day 35 | 860.柠檬水找零 & 406.根据身高重建队列 & 452. 用最少数量的箭引爆气球_第1张图片

 这道题挺简单的。。没有啥技巧,一遍就过了(也没看懂为啥贪心)自己的代码其实还能优化

        int count1=0;
        int count2=0;
        int count3=0;
        for(int x=0;x

406.根据身高重建队列 

Day 35 | 860.柠檬水找零 & 406.根据身高重建队列 & 452. 用最少数量的箭引爆气球_第2张图片

 解题思路:

        一个一个维度考虑!不要一次想着同时对身高+名字排序。

        首先对二维数组根据身高降序排序,身高相同的名次小的站前面,然后再根据名次由前至后插入到结果集中

        因为高个子在前面,后面低次序只需要在当面已经排好的高个子中根据名次进行插入即可。后面比它更低的名次位置由于个子比它低,并不影响它自己的位次。

我能看懂思路,我不会代码实现。。不会对二维数组排序,也不会根据元素大小插入到ans中。。

        Arrays.sort(people, (a, b) -> {
        if (a[0] == b[0]) return a[1] - b[1];
            return b[0] - a[0];
        });

        List ans = new ArrayList();
        for (int[] person : people) {
            ans.add(person[1], person);
        }
        return ans.toArray(new int[ans.size()][]);

452. 用最少数量的箭引爆气球

Day 35 | 860.柠檬水找零 & 406.根据身高重建队列 & 452. 用最少数量的箭引爆气球_第3张图片

 按左边界升序排序贪心解题思路:

        本题其实是求不同气球是否在同一区间内,因此应关注边界。若气球的左边界小于另一个气球的右边界,说明在同一区间

        对气球的起始位置按升序排序,从i=1开始比较,每次比较当前气球的起始边界和上一个气球的右边界

①若大于上个气球的右边界,说明不重合,res++。

否则说明重合,此时更新当前气球的右边界为当前气球右边界和上一个气球右边界取小值,作为下一个气球判断的条件

    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
        int res=1;
        for(int i=1;ipoints[i-1][1]){
                res++;
            }else{
                points[i][1]=Math.min(points[i][1],points[i-1][1]);
            }
        }
        return res;
    }

你可能感兴趣的:(java)