题目
题解
【套路】:一般这种数对,还涉及排序的,根据第一个元素正向排序,根据第二个元素反向排序,或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化解题过程。
对于这道题,我们先按照身高从大到小排序(身高相同的情况下K小的在前面),这样的话,排队时,轮到他的时候,比他高或者相等的已经排好了,他就可以根据K插进去了。假如K=2,排好的队列已经有4个人了,这四个人都比他高,所以他只需要插在第2位后面即可。
class Solution {
public int[][] reconstructQueue(int[][] people) {
int n=people.length;
//people按身高降序,k升序排序
Arrays.sort(people,new Comparator<int[]>(){
public int compare(int[] person1,int[] person2){
if(person1[0]!=person2[0])
return person2[0]-person1[0];//按第一元素降序
else
return person1[1]-person2[1];//按第二元素升序
}});
List<int[]>list=new ArrayList<>();
for(int[] person:people){
//已经排队的人数少于比我高的人数,先排在最后
if(person[1]>=list.size())
list.add(person);
//已经排队的人数多于比我高的人数,插到比我高的人数之后
else
list.add(person[1],person);
}
return list.toArray(new int[list.size()][]);
}
}
时间复杂度: O ( n 2 ) O(n^2) O(n2), O ( n l o g n ) O(nlogn) O(nlogn)的时间进行排序,随后需要 O ( n 2 ) O(n^2) O(n2)遍历每个人并放入队列。
空间复杂度: O ( l o g n ) O(logn) O(logn),排序需要的空间。
p.s 昨天实验室活动鸽掉一天,这周结束生日也就算过完啦,祝新一岁的自己更加坚定沉着、脚踏实地,努力做让父母骄傲的人!