代码随想录第35天|860.柠檬水找零 , 406.根据身高重建队列(很多细节点注意一下),452. 用最少数量的箭引爆气球

860.柠檬水找零 

 思路比较简单

class Solution {
    public boolean lemonadeChange(int[] bills) {
        //然后向你付 5 美元、10 美元或 20 美元
        //如果收到5,直接收下
        //如果收到10,需要付回去5
        //如果收到20,需要付回去10+5或者5+5+5
        //开始时我手上拥有的钱的数量
        int five=0;
        int ten=0;
        int twen=0;
        for(int bill:bills){
            if(bill==5){
                five++;
                
            }
            if(bill==10){
                five--;
                ten++;
            }
            if(bill==20){
                if(ten>0&&five>0){
                    ten--;
                    five--;
                    twen++;
                }
                else if(five>=3){
                    five-=3;
                    twen++;//没有必要加上这句了,因为不会用twen来找零
                }
                else return false;

            }

        }
        return five>=0&&ten>=0;

    }
}

 406.根据身高重建队列(很多细节点注意一下)

出现两个维度一起考虑的情况

其技巧都是确定一边然后贪心另一边,两边一起考虑,就会顾此失彼

如果身高相同,按照k值进行升序;如果身高不同,按照身高进行降序

代码实现

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        //和分发糖果类似,不要两头兼顾,处理好一边再处理另一边。 
        //先按照身高排序,如果身高相同再按ki升序
        Arrays.sort(people,(a,b)->{
            if(a[0]==b[0]) return a[1]-b[1];//a-b是升序排列,故在a[0]==b[0]的状况下,会根据k值升序排列
            return b[0]-a[0];//在a[0]!=b[0]的状况下,降序排列
        });
        //以示例为例子,经过sort后会是:
       // [7,0],[7,1],[6,1],[5,0],[5,2],[4,4]
        LinkedList que=new LinkedList<>();
        for(int[] p:people){
            que.add(p[1],p);//LinkedList.add(index,value)会将value插入指定index里
        }
        return que.toArray(new int[people.length][]);

    }
}

对使用某一种语言容器的使用,特性的选择都会不同程度上影响效率

所以很多人都说写算法题用什么语言都可以,主要体现在算法思维上,其实我是同意的但也不同意。

学到的知识点:

1.Arrays.sort()方法底层使用了三种排序方式:

  • 当数据量在 [0 - 47) 时,采用插入排序;
  • 当数据量在 [47, 286) 时,采用双轴快速排序;
  • 当数据量大于等于 286 时,采用归并排序。

2.在Java中,二维数组可以只定义第一维的长度,而第二维的长度可以不指定。在这种情况下,第二个维度的长度将默认为0。

3.在Java中,LinkedList的add(index, value)方法将value插入到指定index位置时,如果该位置已经有元素存在,则新元素的value会覆盖原有元素的value。

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

首先根绝xstart进行升序排序因为我们要让气球尽可能重复

如果两个气球有重复部分,则重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭,这个时候要更新一下这一组被比较气球的右边界,如下图要过呢更新气球2的右边界为6,防止气球2和气球3又需要新增一只弓箭。

如果没有重复部分,则需要一只弓箭

代码随想录第35天|860.柠檬水找零 , 406.根据身高重建队列(很多细节点注意一下),452. 用最少数量的箭引爆气球_第1张图片

可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。

开始的代码

class Solution {
    public int findMinArrowShots(int[][] points) {
        //按xstart升序排序
    
       Arrays.sort(points,(a,b)->{
            return a[0]-b[0];
         });
        int count=0;
        for(int i=0;i

溢出问题

代码随想录第35天|860.柠檬水找零 , 406.根据身高重建队列(很多细节点注意一下),452. 用最少数量的箭引爆气球_第2张图片

由于Integer类型的最大值为2^31-1,因此使用Integer.compare()方法进行比较不会发生溢出。 

修改后的代码

class Solution {
    public int findMinArrowShots(int[][] points) {
        //按xstart升序排序
      //  int num=0;
        // 使用Integer内置比较方法,不会溢出
        Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
        int count=1;// points 不为空至少需要一支箭
        for(int i=0;i

你可能感兴趣的:(算法训练营,算法)