leetcode_middle_2_406. Queue Reconstruction by Height

本文介绍了一种解决特定问题的算法——如何根据每个人的身高及指定条件来重建队列。通过将人员按身高降序排列,并根据指定条件将其插入适当位置,最终实现队列的有序重建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

一个二维数组,表示一列人,每个人用一个[h, k]数组描述,h表示这个人的身高,k表示队列前面身高大于等于这个人的数目。

分析:

比如:

[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

无论是h还是k,都不能作为排序的依据,没什么规律可言。那么,这个排序事件最最核心的就是:前面比我还高的人数。要满足这个条件。

比如[6,1]  前面比它高的人数是1 ,就是7 (两个5相当于没有)

所以抽离出来:[7,0] [6,1] 是这样的。

我们发现[7,0]的0就表示前面有0个比他高的,所以在角标0,[6,1]的前面有1个比他高的所以在角标1.但是为什么最后变成了[5,0],[7,0],[5,2],[6,1]呢?因为[5,?]不影响[6,1]相对位置的正确性,所以使其角标不等于k.意思就是说,更矮的人,可能使更高的人的k从等于角标变成大于角标。变化之后是没什么规律的。但是变化之前k==角标。

所以我们抓住这个重点:当队列里的人的身高都大于等于自己的身高的时候,自己的k值就是角标。

所以我们要解题的关键就是:使一组身高[h,?]排入队列的时候,队列里只有比它高的或者一样高的。也就是说从高到低放入(插入)一个新队列。

public class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, new Comparator<int[]>() {  //排序的目的是为了先处理高的
            public int compare(int[] a, int[] b) {
                if (b[0] == a[0])     //高度相等的时候,k小的在前面
                    return a[1] - b[1];  //否则ArrayList.add()可能越界
                return b[0] - a[0];
            }
        });
  
        ArrayList<int[]> al = new ArrayList<>();  //因为要插入,所以使用动态数组
        for (int i = 0; i < people.length; i++)
            al.add(people[i][1], new int[]{people[i][0], people[i][1]});  //根据k直接站到相应角标位

        int i = 0;
        for (int[] a : al) {
            people[i][0] = a[0];
            people[i][1] = a[1];
            i++;
        }
        return people;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值