根据身高重建队列
假设有打乱顺序的一群人站成一个队列,数组 people
表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki]
表示第 i
个人的身高为 hi
,前面 正好 有 ki
个身高大于或等于 hi
的人。
请你重新构造并返回输入数组 people
所表示的队列。返回的队列应该格式化为数组 queue
,其中 queue[j] = [hj, kj]
是队列中第 j
个人的属性(queue[0]
是排在队列前面的人)。
示例 1:
1 | 输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]] |
示例 2:
1 | 输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]] |
提示:
1 <= people.length <= 2000
0 <= hi <= 10^6^
0 <= ki < people.length
- 题目数据确保队列可以被重建
这道题感觉就是需要先排序,没错我们就是先按照身高排序,身高hi相同的ki小的在前面,这样的话我们就可以按照排完序的顺序往队列queue中依次添加元素了,因为新添加的元素肯定是小于等于已加入队列中的元素(身高hi相同的ki小的先插入在前面),因此我们直接根据ki选择插入位置,队列中已有元素的关系也不会被破坏(因为身高hi相同的ki小的先插入在前面):
按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。
回归本题,整个插入过程如下:
排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]
插入的过程:
- 插入[7,0]:[[7,0]]
- 插入[7,1]:[[7,0],[7,1]]
- 插入[6,1]:[[7,0],[6,1],[7,1]]
- 插入[5,0]:[[5,0],[7,0],[6,1],[7,1]]
- 插入[5,2]:[[5,0],[7,0],[5,2],[6,1],[7,1]]
- 插入[4,4]:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
1 | public int[][] reconstructQueue(int[][] people) { |