思路:
首先我们将所有的序列按照身高 hi 从大到小排序,身高相同的就按照 ki 从小到大排序。
如 [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]] 排完序以后就是 [7,0] [7,1] [6,1] [5,0] [5,2] [4,4]
建立一个linkedlist,遍历这个序列,每一次都将当前 [hi, ki ] 按照其 ki 作为下标插入列表中。
我一开始每次插入都从头开始遍历,去找那个大于等于hi 的个数为ki的位置,后来发现列表中的所有元素都大于等于当前元素,所以就直接按照ki 插入就可以了。时间复杂度直接从n2降为n
原始版本:
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 a[1]-b[1];
else
return b[0]-a[0];
}
});
LinkedList<int[]> list = new LinkedList<>();
for(int[] i:people)
{
int j = 0;
int k = i[1];
for(j = 0;j<list.size();j++)//原始版本里面还又加了一个遍历
{
if(k==0)
break;
int[] m = list.get(j);
if(m[0]>=i[0])
k--;
}
list.add(j,i);
}
return list.toArray(new int[people.length][]);
}
}
修正版本:
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 a[1]-b[1];
else
return b[0]-a[0];
}
});
LinkedList<int[]> list = new LinkedList<>();
for(int[] i:people)
{
list.add(i[1],i);
}
return list.toArray(new int[people.length][]);
}
}