89、★★贪心-多维度-LeetCode-406.根据身高重建队列

题目描述

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

来源:力扣(LeetCode)

中国人寿秋招面试题

思路

1)想到了按身高由高到低排序,也想到了插空进去;但是不知道具体怎么插空!

2)排序方法,参数传入Comparator比较器!

按身高由高到低排序;在按照k由低到高排序!

        Arrays.sort(people, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[0] == o2[0]) return o1[1] - o2[1];
                return o2[0] - o1[0];
            }
        });

3)后插入的不影响先插入

先按照最高的来进行插入,插入后当前的队列符合要求;在依次对身高较低的进行插孔,对整体不会产生影响!

最高的插孔,要么前面是一样高的;要么坐标就是0,最高的下标为0的只有一个!

后面更低的,下标值的影响,只能由前面身高的来影响;而其不管插入到哪儿,对前面高个子的标准没有影响!

代码

1)二维的贪心

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        //二维数组的维度,每行上的内容不改变,只调整行的顺序
        //按照身高由大到小排列!后面的总是小于前面的身高
        //按照身高,由高到低排序;同样的身高,就由低到高
        Arrays.sort(people, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[0] == o2[0]) return o1[1] - o2[1];
                return o2[0] - o1[0];
            }
        });
        //排好序
        List<int[]> list = new ArrayList<>();//用链表进行 插空
        for(int[] p : people){
            list.add(p[1],p);//p[1]是下标,往特定位置插入
        }
        return list.toArray(new int[list.size()][2]);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值