0
点赞
收藏
分享

微信扫一扫

Springboot笔记-05

陬者 03-21 08:00 阅读 4
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

1. 从高到底排序

解题思路:时间复杂度O( n 2 n^2 n2),首先按照身高降序进行快速排序需要 n ∗ l o g 2 n n*log_{2} n nlog2n,之后需要按照前面有几个人比它高,进行插入排序,需要O( n 2 n^2 n2),时间复杂度按大头来,所以是O( n 2 n^2 n2)。空间复杂度O( l o g 2 n log_{2} n log2n),快速排序的栈空间
  1. 然后使用插入算法,依次将每个元素按照第二个字段插入到对应位置(第二个字段是几就插入到第几个位置)
  1. 因为是按照第一个字段降序排列,第二个字段代表前面比它高或者和它一样高的人数。所以后面的元素(都比前面的小)插入到前面来,对于这些人是不受影响的,因为后面的元素都比它矮。
  2. 很重要的一点,相同身高的人,一定是第二个字段小的先来,例如[5,1]和[5,2].前面有[7,0][7,1].
代码
class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, new Comparator<int[]>() {
            @Override
            public int compare(int[] person1, int[] person2) {
               //如果两个人身高不同,身高较高的排前面。第一个字段不同,用第一个字段降序排列
               if(person1[0] != person2[0]) return person2[0] - person1[0];
               //如果两个人身高相同,前面比它高的人数少的排前面。第一个字段相同,按第二个字段升序排列
               //例如 [5,2]和[5,1]正在排序,第一个字段都是5,此时我们想要[5,1]排到[5,2]前面
               else return person1[1] - person2[1];
            }
        });
        //按照身高从高到底排列完成
        //接下来,按顺序操作每个人,这些人的前面的人都比它高
        //当前人物插入到前面,因为前面的人物身高都比他高,不会影响前面这些人物。
        List<int[]> ans = new ArrayList<>();
        for(int[] person:people)
            ans.add(person[1],person);//当前人物,要求必须有几个比它高的人在前面,就把他插入到第几个位置(因为前面的都比它高或和它一样高)
        return ans.toArray(new int[ans.size()][]);
    }
}
举报

相关推荐

0 条评论