题目
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。
请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
我一开始的想法是,先根据身高进行从高到低排序,然后根据k值进行从小到大排序,贪心的去求解。
根据其他人的说法,这类的题的总结是:
根据代码随想录所学,对于这种有两个维度一起出现的,一般都是先确定一边,然后对另外一个边进行贪心。
感觉本身不是很难,虽然有的说比那个135.分发糖果难,但是我是反而这个更容易想到先处理身高,再处理K值,可能是因为我刚做完“分发糖果”,举一反三比较厉害,hhh。记录的原因主要是因为,Java的比较器的重写不太熟练,以及ArrayList方法add(int index, E element)这个index参数,在数组中的情况没咋见过。
代码实现:来自LeetCode官方题解
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people, new Comparator<int[]>() {
public int compare(int[] person1, int[] person2) {
if (person1[0] != person2[0]) {
return person2[0] - person1[0];
} else {
return person1[1] - person2[1];
}
}
});
//Arrays.sort(people, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]); //也可以是lambda函数实现比较重载
List<int[]> ans = new ArrayList<int[]>();
for (int[] person : people) {
ans.add(person[1], person);
// System.out.println(person[1]);
}
return ans.toArray(new int[ans.size()][]);
}
}
代码解释和API学习:
- 比较器重载:直接方法重写,整个整体作为Arrays.sort()的参数。
- 二维数组重排,Comparator的参数就是一维数组,一维数组的参数就是int。
- person1[0] != person2[0] : 数组的0号位值不相同,就return person2[0] - person1[0] :后 - 前,就是按0号索引值,从大到小。本题中就是,身高从高到低。
- 相同情况,就return person1[1] - person2[1]: 按元素一维数组的1号索引位置从小到大排。
- ans.add()中,就是add(int index, E element)。插入的元素就是 person这个数组地址(每个行数组,一插就是一行,数组名就是数组地址)。插入的index 位置就是 person[1] 第二列代表的值,本题中就是前面有几个比当前高的值。
- 最后是List 转成数组:toArray():
- arraylist.toArray(T[] arr):
- T [] arr(可选参数)- 用于存储数组元素的数组,这里 T 指的是数组的类型。
- 如果参数 T[] arr 作为参数传入到方法,则返回 T 类型的数组。如果未传入参数,则返回 Object 类型的数组。
- 这里参数是:new int[行数][]一个二维数组。
人类可真奇怪,明明赚钱不开心嘛,那为啥还要赚钱呀 ——熊二