假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。
请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。
题解
【排序预处理+贪心】
套路:一般这种数对,还涉及排序的,根据第一个元素正向排序,根据第二个元素反向排序,或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化解题过程。
方法:排序预处理+贪心
假设有打乱顺序 意味着原始的数组满足排序
第一个数字,第一优先级排序,由高到低,是为了用下标就能表示前面有几个元素比当前元素 大于等于
第二个数字,第二优先级排序,由低到高,当身高一样的时候,人数少的就应该放前面(正确性保障)
从 A 里挑身高最高的人 x 出来,插入到 B. 因为 B 中每个人的身高都比 x 要高,因此 x 插入的位置,就是看 x 前面应该有多少人就行了。比如 x 前面有 5 个人,那 x 就插入到队列 B 的第 5 个位置。
小的插到前面,其实不会对后面的大的造成影响,因为小的不参与第二位计数
时间复杂度:O(n^2)
空间复杂度:O(n)
class Solution {
public int[][] reconstructQueue(int[][] people) {
//注意本行写法
Arrays.sort(people,(v1,v2)->(v1[0]!=v2[0]?v2[0]-v1[0]:v1[1]-v2[1]));
List<int[]> res = new ArrayList<>();
for(int[] person: people){
res.add(person[1],person);
}
//注意本行写法
return res.toArray(new int[res.size()][]);
}
}