406. Queue Reconstruction by Height
Posted keepac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了406. Queue Reconstruction by Height相关的知识,希望对你有一定的参考价值。
这题本质上是贪心法, 一个原则 “只有比你身高高的或者相等的才对你有影响,插入任何比你小的人都对你没影响” 因此从大到小排列,先处理大的,再处理小的。每次处理时K 就是插入的位置,因为前面人的身高都比你高或者一样,所以你的K 是多少就决定了你的下标。
people:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
排序后:
[[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]
1. [7.0] 然后 处理[7,1]时只用看 K=1, 那 必然在1的位置, 变成了[7,0], [7,1],
2. [6 1] 因为K=1, 必然 也在下标为1 的位置。 [7,0], [6 1] [7,1],
3. [5 0] 变成 [5 0] [7 0] [6 1] [7 1]
4. [5 2] 变成 [5 0] [7 0] [5 2] [6 1] [7 1]
5.[4 4] 因为K=4 ,只要数4个位置 变成 [5 0] [7 0] [5 2] [6 1] [4 4] [7 1]
1 class Solution { 2 public int[][] reconstructQueue(int[][] people) { 3 //int[][] 可以看成特殊的一维数组,所以用Arrays.sort() 4 Arrays.sort(people, (o1,o2)->(o1[0]==o2[0]? o1[1]- o2[1]: o2[0]-o1[0])); 5 6 List<int[]> list = new LinkedList<>(); 7 for(int[] pl: people){ // 1. 注意List 这种 add(int index, E element), 可以直接add 到index 8 list.add(pl[1], pl); //2. 只需要把pl 的reference 放入List即可,不需要new 一个对象 9 } 10 11 int[][] result = new int[people.length][];// 3.new 一个二位数组时,不用指定第二维的长度 12 for(int i=0; i<people.length; i++){ 13 result[i] = list.get(i); // 4.直接copy reference 返回即可 14 } 15 return result; 16 } 17 }
以上是关于406. Queue Reconstruction by Height的主要内容,如果未能解决你的问题,请参考以下文章
[leetcode-406-Queue Reconstruction by Height]
LeetCode 406: Queue Reconstruction
[LeetCode] 406. Queue Reconstruction by Height(按身高重排队列)
[leetcode] 406.Queue Reconstruction by Height