刷怪日记-根据身高重建队列

406 根据身高重建队列
题目

解题思路
  • 此题需要依据身高h和数目k俩个维度进行排序,那么需要先确定下一个维度,那么接下来只需要确定另外一个维度即可。
  • 假如说先依据k对people进行排序,然后在按照h进行排序,会发现并不符合要求。因此本题先依照身高h进行第一次排序
  • 题目要求高的站前面,那么排序时,h大的放前面,身高h相同的k小放前面。
  • 按照贪心算法原则,全部局部最优推出全局最优
    • 局部最优:优先按照身高高的people的k进行插入,插入操作过后的people满足队列属性。
    • 最后都做完插入操作,整个队列满足题目队列属性
  • 完成第一个维度身高h排序后,Java可以通过LinkedList进行排序,LinkedList.add(index, element),将k作为index索引,然后将对应元素插入该列表中的k个索引位置,即使得列表符合题意。
具体代码
public int[][] reconstructQueue(int[][] people) {

        Arrays.sort(people, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
            	// 身高相同 k小站前面
                if(o1[0] == o2[0]) return o1[1]-o2[1];
                // 身高高站前面
                return o2[0] -o1[0];
            }
        });

        LinkedList<int[]> que = new LinkedList<>();
        for(int[] p : people){
            que.add(p[1], p); //将元素p插入p[1]索引处
        }
        return que.toArray(new int[people.length][]);
    }
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值