思路:根据题目中数组中数对的定义,数对中第一个元素应该按降序排列,因为每个元素前面都有高于等于自己的;数对的第二个元素应该按升序排列,因为定义了前面有多少高于等于自己的数对。
先排好顺序后再利用linkedlist的add方法进一步排序。
linkedlist的add方法如下:
public void add(int index, E element) {
checkPositionIndex(index);
if (index == size)
linkLast(element);
else
linkBefore(element, node(index));
}
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
void linkBefore(E e, Node<E> succ) {
// assert succ != null;
final Node<E> pred = succ.prev;
final Node<E> newNode = new Node<>(pred, e, succ);
succ.prev = newNode;
if (pred == null)
first = newNode;
else
pred.next = newNode;
size++;
modCount++;
}
public int[][] reconstructQueue(int[][] people){
Arrays.sort(people, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0]!=o2[0]){
return o2[0]-o1[0];
}
else{
return o1[1]-o2[1];
}
}
});
List<int[]> list=new LinkedList<>();
for(int i=0;i<people.length;i++){
if(list.size()>people[i][1]){
list.add(people[i][1],people[i]);
}
else{
list.add(list.size(),people[i]);
}
}
return list.toArray(new int[list.size()][]);
}