题目描述:
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
注意:
总人数少于1100人。
示例
输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
解题思路
1.首先要知道,身高比较高的人"看不见"比较矮的人,所以比较矮的人咋排列方式,不会影响身高比较高的人(太TM的真实啦)
2.所以要先排列身高比较高的人,之后再根据每个人的K值插入身高比较矮的人
3.考虑身高相同但是K值不同的人,这就很明显啦,因为身高相同的人也可以看到,所以K值较小的人在最前面
解题推算图(图片引用力扣):
解题代码:
public static int[][] reconstructQueue(int[][] people) {
// 定义排序方式:按照左区间升序排列,如果左区间相同,按照右区间降序
Arrays.sort(people, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]==o2[0] ? o1[1]-o2[1] : o2[0] - o1[0];
}
});
LinkedList<int[]> list = new LinkedList<int[]>();
for (int[] i : people) {
list.add(i[1], i);
}
return list.toArray(new int[list.size()][2]);
}
知识拓展:
sort排序
1.Arrays.sort(int[] a)
对一个数组的所有元素进行排序,并且是按从小到大的顺序。
2、Arrays.sort(int[] a, int fromIndex, int toIndex)
这种形式是对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序,注意:下标为toIndex的元素不参与排序
3、public static void sort(T[] a,int fromIndex,int toIndex, Comparator c)
上面有一个拘束,就是排列顺序只能是从小到大,这个方式可以进行选择升序或者降序
4. Arrays.sort(int[] a, Comparator c)
List
LinkList
LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
数据结构:
add方法
List接口中的add方法有如下两种重载方式:
① boolean add(E e);
② void add(int index, E element);
其中,方法①用于向列表的末尾插入新元素,这也是List接口中最常用的插入方法;方法②则可以在插入操作过程中指定插入的位置,此时,会自动将当前位置及只有的元素后移进行插入,需要注意的是,参数index的值不可大于当前list的容量,即在使用此方法填充一个list时,必须以0开始依次填充。
第二种方法的源码如下:
public void add(int index, E element) {
checkPositionIndex(index);
if (index == size)
linkLast(element);
else
linkBefore(element, node(index));
}
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++;
}
实例如下:
个人收获:
该题主要有两天:1.排列的算法,因为高人看不到矮人,所以先排高人,再排矮人 2.找到合适的数据结构来实现算法,能够直接插入到某一个指定的位置
一直使用List,但是没有注意过他的add方法,这一次练习,我觉得还有很多东西要学,掌握的越多,实现算法就会越简单