leetcode406. 根据身高重建队列

该博客讨论了一种利用贪心策略解决队列重构问题的方法。具体来说,给定一组人及其前面身高不低于自己的人数,算法通过身高降序及相同身高时k值升序的排序,重建原始队列。在实现过程中,使用了Java的Comparator进行排序,并用ArrayList存储结果,确保了队列的正确构造。
摘要由CSDN通过智能技术生成

1.题目描述:

假设有打乱顺序的一群人站成一个队列,数组people表示队列中一些人的属性(不一定按顺序)。每个people[i] = [hi, ki]表示第i个人的身高为hi,前面正好有ki个身高大于或等于hi的人。请你重新构造并返回输入数组people所表示的队列。返回的队列应该格式化为数组queue,其中queue[j] = [hj, kj]是队列中第j个人的属性(queue[0]是排在队列前面的人)。

2.贪心算法:

leetcode860. 柠檬水找零一样,有两个维度的比较,先比较一个维度上的。升高降序,若身高相同则k值小的在前面;再从高到低按照k值插入到相应的位置即可,后面插入的必不会影响前面插入的正确性(升高小于等于前面插入的)。

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, new Comparator<int[]>() {//使用Comparator对象进行比较排序
            public int compare(int[] a, int[] b) {
                if (a[0] == b[0]) return a[1] - b[1];
                else return b[0] - a[0];
            }
        });
        List<int[]> list = new ArrayList<>();//这里可用链表优化
        for (int i = 0; i < people.length; i++) {
            list.add(people[i][1], people[i]);
        }
        return list.toArray(new int[people.length][]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值