题目描述:
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。
请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。
来源:力扣(LeetCode)
中国人寿秋招面试题
思路:
1)想到了按身高由高到低排序,也想到了插空进去;但是不知道具体怎么插空!
2)排序方法,参数传入Comparator比较器!
按身高由高到低排序;在按照k由低到高排序!
Arrays.sort(people, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0] == o2[0]) return o1[1] - o2[1];
return o2[0] - o1[0];
}
});
3)后插入的不影响先插入!
先按照最高的来进行插入,插入后当前的队列符合要求;在依次对身高较低的进行插孔,对整体不会产生影响!
最高的插孔,要么前面是一样高的;要么坐标就是0,最高的下标为0的只有一个!
后面更低的,下标值的影响,只能由前面身高的来影响;而其不管插入到哪儿,对前面高个子的标准没有影响!
代码:
1)二维的贪心:
class Solution {
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 o1[1] - o2[1];
return o2[0] - o1[0];
}
});
//排好序
List<int[]> list = new ArrayList<>();//用链表进行 插空
for(int[] p : people){
list.add(p[1],p);//p[1]是下标,往特定位置插入
}
return list.toArray(new int[list.size()][2]);
}
}