代码随想录算法训练营 day 35: ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

78 阅读1分钟

860. Lemonade Change

逻辑还算清楚。还以为有什么简洁的解法,但似乎也没有。

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int pocket5 = 0;
        int pocket10 = 0;

        for(int i=0; i<bills.length; i++) {
            int bill = bills[i];
            if(bill == 5) {
                pocket5++;
                continue;
            }
            else if (bill == 10) {
                if(pocket5 == 0) {
                    return false;
                }
                else {
                    pocket5--;
                    pocket10++;
                    continue;
                }

            }
            else if (bill == 20) {
                if(pocket5 == 0 || (pocket10 == 0 && pocket5 < 3)) {
                    return false;
                }
                else {
                    if(pocket10 > 0) {
                        pocket10--;
                        pocket5--;
                        continue;
                    }
                    else {
                        pocket5 -= 3;
                        continue;
                    }

                }
            }
        }

        return true;
    }
}

406. Queue Reconstruction by Height 题意有点繁琐。思路是先按照高矮排序,然后用新数组往固定位置插元素。排序的时候,同样高度的,要按照前面人数的升序来排。Java的lambda注意用法。

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        int len = people.length;

        if(len == 1) {
            return people;
        }

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

        LinkedList<int[]> rlist = new LinkedList<>();

        for(int[] p : people) {
            rlist.add(p[1], p);
        }

        return rlist.toArray(new int[people.length][]);
        
    }
}

452. Minimum Number of Arrows to Burst Balloons 没思路的一题。破冰是要更新当前处理元素的结尾,为当前和之前一个元素结尾的min值。这是处理相交的情况。 不相交的情况,箭的count直接++

class Solution {
    public int findMinArrowShots(int[][] points) {
        if(points.length == 0) {
            return 0;
        }

        Arrays.sort(points, (a,b)->{
            return Integer.compare(a[0], b[0]);
        });

        int result = 1;

        for(int i=1; i<points.length; i++) {
            if(points[i][0] > points[i-1][1]) {
                result++;
            }
            else {
                points[i][1] = Math.min(points[i][1], points[i-1][1]);
            }
        }

        return result;
    }
}