思路:
先按身高降序排列,如果身高相等,就按人数升序排序
代码:
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people,new Comparator<int[]>(){
public int compare(int[] a,int[] b){
if(a[0]!=b[0]){
//按身高降序
return b[0]-a[0];
}
else{
//如果身高相等,按人数升序
return a[1]-b[1];
}
}
});
List<int[]> list=new ArrayList<>();
for(int[] person:people){
//指定下标加入值
list.add(person[1],person);
}
//注意是二维数组,所有是new int[][]
return list.toArray(new int[list.size()][]);
}
}
分解:
1)二维数组中下标0位置代表身高,1位置代表之前比该数身高大的个数
2)重写快排:按身高降序,身高相等时按人数升序
3)将排好的people存到新队列中,Arraylist有一个add方法是按指定的下标插入值
这里则按k,也就是比当前身高高的人数作为下标插入一位数组
4)注意要返回的是二维数组,所以是new int[][]
复杂度分析:
时间复杂度:O(O^2)排序的时间复杂度为O(NlogN),遍历并加入队列的时间复杂度为O(N^2)
因为是指定下标插入,也要先遍历到指定位置再加入,这个过程也需要O(N)
空间复杂度:O(logN)排序所需要的栈空间,创建的队列不需要额外空间