1.题目描述:
假设有打乱顺序的一群人站成一个队列,数组people表示队列中一些人的属性(不一定按顺序)。每个people[i] = [hi, ki]表示第i个人的身高为hi,前面正好有ki个身高大于或等于hi的人。请你重新构造并返回输入数组people所表示的队列。返回的队列应该格式化为数组queue,其中queue[j] = [hj, kj]是队列中第j个人的属性(queue[0]是排在队列前面的人)。
2.贪心算法:
与leetcode860. 柠檬水找零一样,有两个维度的比较,先比较一个维度上的。升高降序,若身高相同则k值小的在前面;再从高到低按照k值插入到相应的位置即可,后面插入的必不会影响前面插入的正确性(升高小于等于前面插入的)。
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people, new Comparator<int[]>() {//使用Comparator对象进行比较排序
public int compare(int[] a, int[] b) {
if (a[0] == b[0]) return a[1] - b[1];
else return b[0] - a[0];
}
});
List<int[]> list = new ArrayList<>();//这里可用链表优化
for (int i = 0; i < people.length; i++) {
list.add(people[i][1], people[i]);
}
return list.toArray(new int[people.length][]);
}
}