class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people, (a, b) -> {
if (a[0] == b[0]) return a[1] - b[1];
return b[0] - a[0];
});
LinkedList<int[]> que = new LinkedList<>();
for(int[] p : people){
que.add(p[1],p);
}
return que.toArray(new int[people.length][]);
}
}
一、这道题和分发糖果的那道题是一个题型:遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。
二、LinkedList.add() 方法是 Java 中 LinkedList 类的方法之一,用于在链表的末尾添加一个元素。底层原理涉及到链表的数据结构和指针操作。
LinkedList 是由节点(Node)组成的链表结构,每个节点包含一个数据元素和指向下一个节点的指针。在链表中,每个节点都是通过指针与前一个节点和后一个节点连接起来的。
当调用 LinkedList.add() 方法时,它会执行以下步骤:
- 创建一个新的节点,将要添加的元素作为节点的数据元素。
- 如果链表为空(即没有任何节点),则将新节点设置为链表的头节点。
- 否则,找到链表的最后一个节点。
- 将最后一个节点的指针指向新节点,将新节点设置为链表的最后一个节点。
这样,新节点就被成功添加到了链表的末尾。
LinkedList.add() 方法的时间复杂度为 O(1),因为它只需要执行常数次指针操作,而不受链表长度的影响。这使得在链表的末尾添加元素非常高效。
需要注意的是,由于 LinkedList 是一个双向链表,还可以使用 LinkedList.addFirst() 方法在链表的开头添加元素,以及使用 LinkedList.add(index, element) 方法在指定位置插入元素。这些方法的底层原理与 LinkedList.add() 类似,都是通过节点和指针操作完成的。