406.根据身高重建队列
思路
因为此排序与两个元素有关,所以单纯的排序某个元素很难操作。而排序的规则,首先第一个元素同条件下,尽量大的在前面;第二个元素,同首元素下,需要小的在前面(因为前面是大于等于它的)。所以需要同时考虑两个元素的排序,而这种排序有特定的方法。排好序之后因为首元素大的在前面,所以从头开始,后面的元素其前面的都比自己大或者相等,这个个数就要对应尾元素的数字,此时存在有些首元素大的需要排到后面,当前数对直接放到所在下标即可,保证了前面都比自己大,也保证了个数。
代码
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people,(o1, o2) -> o1[0]==o2[0]?o1[1]-o2[1]:o2[0]-o1[0]);//记
List<int[]> list=new ArrayList<>();
for (int[] i:people) { //记
list.add(i[1],i);
}
return list.toArray(new int[list.size()][2]);//记
}
}
总结和技巧
- 数对首尾元素同时排序(不同排序方式):
Arrays.sort(people,(o1, o2) -> o1[0]==o2[0]?o1[1]-o2[1]:o2[0]-o1[0]);
—— 首升尾降 - for-each循环:适合对每个元素进行操作,其中冒号前面的是数组的每个元素的类型,本题二维数组的每个元素是一维数组。
for (int[] i:people) { }
- 需要元素逐个操作,加到数组,并且需要对下标进行一些操作,直接用数组麻烦,可以用List。
list.add(E e)
直接List加元素,list.add(int index,E e)
向List的index下标加元素。- List转为数组:
list.toArray(T[] arr)
T [] arr(可选参数)- 用于存储数组元素的数组,T为数组类型,如果不带参数,返回Object类型的数组。而且,参数是需要new的空数组****。 - List转数组声明参数需要为引用类型,int[]为引用类型,所以可以
list.toArray(new int[list.size()][2]);
,但是不能list.toArray(new int[2]);
,因为int不是引用类型。