lambda表达式简介 链接
lambda表达式中的升序和降序排列 的使用方式 链接
- 先按照h维度(第一维度)的身高顺序从高到低排序。确定第一个维度
- lambda返回的是一个元组:当x[0](维度h)相同时,再根据x[1](第二维度:前面的人数 k )从小到大排序(升序)
- 若身高不同,则按照 (第一维度的)降序排列,即身高矮的在后面
class Solution {
public int[][] reconstructQueue(int[][] people) {
/*
按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面
可以确定一个维度了,就是同一 身高,前面的节点一定都比本节点高!
只需要按照k为下标重新插入队列就可以了
局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性
全局最优:最后都做完插入操作,整个队列满足题目队列属性
局部最优可推出全局最优,找不出反例,那就试试贪心。
先按照h维度的身高顺序从高到低排序。确定第一个维度
lambda返回的是一个元组:当x[0](维度h)相同时,再根据x[1](维度k)从小到大排序
根据每个元素的第二个维度k,贪心算法,进行插入
people已经排序过了:同一高度时k值小的排前面。
*/
Arrays.sort(people, (a, b) -> {
//用a b来表示两个人,当a b的第一维度即身高相同的时候,其按照第二维度的升序排列
if (a[0] == b[0]) return a[1] - b[1];
//若身高不同,则按照 降序排列,即身高矮的在后面
return b[0] - a[0];
});
LinkedList<int[]> que = new LinkedList<>();
//使用增强for循环,将people中的元素赋值给p数组,然后将p中的元素都放入到一个列表中
for (int[] p : people) {
que.add(p[1],p);
}
//最后返回的是将队列转换成数组的形式,其长度是people的长度
return que.toArray(new int[people.length][]);
}
}