题目描述

image.png

解题思路

思路就是两个维度的判断,先判断一个维度,首先根据身高进行排序,从大到小排好序后,此时在按照频率k来进行排序,此时不用调顺序也可以保证每个前面都是大于本身的,因为已经按照身高排序好了。
本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后在按照另一个维度重新排列。
如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。
那么按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。
此时我们可以确定一个维度了,就是身高,前面的节点一定都比本节点高!
那么只需要按照k为下标重新插入队列就可以了,为什么呢?
以图中{5,2} 为例:
image.png按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。
所以在按照身高从大到小排序后:
局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性
全局最优:最后都做完插入操作,整个队列满足题目队列属性

  1. // 局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性
  2. // 全局最优:最后都做完插入操作,整个队列满足题目队列属性
  3. public int[][] reconstructQueue(int[][] people) {
  4. // 身高从大到小排(身高相同k小的站前面)
  5. Arrays.sort(people, (a, b) -> {
  6. if (a[0] == b[0]) return a[1] - b[1];
  7. return b[0] - a[0];
  8. });
  9. ArrayList<int[]> res = new ArrayList<>();
  10. // 将身高按照k进行排序
  11. for (int[] ints : people) {
  12. res.add(ints[1], ints); // 在此列表中的指定位置插入指定的元素。
  13. }
  14. // public <T> T[] toArray(T[] a) 传入泛型
  15. return res.toArray(new int[res.size()][]);
  16. }