创造营第三十五天 | ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

 860.柠檬水找零 

没做出来

代码随想录

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int numFive = 0;
        int numTen = 0;
        //int numTwenty = 0;
        for(int i = 0; i < bills.length; i++) {
            if(bills[i] == 5) {
                numFive ++;
            } else if(bills[i] == 10) {
                numTen ++;
                numFive --;
            } else if(bills[i] == 20) {
                //numTwenty ++;
                if(numTen > 0) {
                    numTen --;
                    numFive --;
                } else {
                    numFive -= 3;
                }
            } //else return false;
            if(numFive < 0 || numTen < 0) return false;//忘记判断
        }
        return true;
    }
}

 406.根据身高重建队列 

排序:按照身高由高至低排列,身高相同的根据k由小到大排列

局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性

全局最优:最后都做完插入操作,整个队列满足题目队列属性

代码随想录

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        LinkedList que = new LinkedList<>();
        Arrays.sort(people, (a, b) -> {
            if(a[0] == b [0]) return a[1] - b[1];//k升序
            return b[0] - a[0];//h降序
        });
        //排序之后people[i] 前面的人身高都是大于等于hi 此时利用ki作为新数组的索引重新构造数组
        for(int[] p : people) {
            que.add(p[1], p);  
        }
        return que.toArray(new int[people.length][]);
    }
}

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

将左边界进行排序,比较相邻区域是否有重叠,若无,射击次数加一,有,更新右边界

局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。

代码随想录

class Solution {
    public int findMinArrowShots(int[][] points) {
        int res = 1;
        Arrays.sort(points, (a,b) -> Integer.compare(a[0], b[0]));//根据左边界进行升序排序
        for(int i = 1; i < points.length; i++) {
            if(points[i - 1][1] < points[i][0]) res++;//相邻边界没有重叠,射击次数加一
            else {
                points[i][1] = Math.min(points[i][1], points[i - 1][1]);//重叠,更新最小右边界
            }
        }
        return res;
    }
}

 

你可能感兴趣的:(算法,leetcode)