Leetcode 406 (java)根据身高重建队列

题目很有意思,(h,k)分别表示身高以及排在这个人前面并且身高大于自己的人数,然后重新建立这个队列

说实话,刚刚看到这道题的我有点懵,花了蛮久才搞清楚题目的意图,是要按照身高以及那个序号k,重新建立这个队列,有种想法,身高重的应该放在前面,顺序不会轻易改变,然后,同等身高的话,就去看顺序号k,应该就ok了。

渣渣的我,其实没有做出来这道题,看到大佬的答案,一开始也是看不懂,经过反复的推敲打磨,才真正搞明白,下面就由我给大家剖析一下,我觉得很有趣的一个大佬的答案吧!

二话不说,先看代码:

public int[][] reconstructQueue(int[][] people) {
        if (people == null || people.length == 0 || people[0].length == 0) {
            return new int[0][0];
        }
        Arrays.sort(people, new Comparator<int[]>() {
            public int compare(int[] o1, int[] o2) {
                if (o1[0] == o2[0]) return o1[1] - o2[1];
                else return o2[0] - o1[0];
            }
        });
        List<int[]> result = new ArrayList<>();
        for (int[] cur : people) {
            result.add(cur[1], cur);
        }
        int[][] res = result.toArray(new int[people.length][]);
        return res;
    }

原代码链接:https://blog.csdn.net/katrina95/article/details/79168371

这个代码是我看完诸多代码之后,觉得很有意思,也是能读懂一些的有趣的代码。一起分析一下有趣的小点吧!

第一个就是构造器,以前都不知道这个东东(原谅我是个渣渣),构造器默认是按照从小到大的顺序排列的,除非指定按照从大到小,因此,

public int compare(int[] o1, int[] o2) {
                if (o1[0] == o2[0]) return o1[1] - o2[1];
                else return o2[0] - o1[0];
            }

这块代码的意思,就是如果身高相同的话,就按照顺序号由小到大的顺序排列,如果是身高不同的话,就按照身高由大到小的顺序排列,其实这道题如果想到了这个,也就结束了,这个就是精髓所在啊,其实就是一个这么小点,堪称画龙点睛之笔。

接下来比较好玩的点,就是按照顺序号,把排序好的数组,塞进去,这个也挺有意思的,

for (int[] cur : people) {
            result.add(cur[1], cur);
        }

不怕大家笑话,这个我也看了蛮久,不明白为什么要这么写呢,想了很久,终于有一丢丢读懂了,是因为要按照顺序号进行插入,而cur[1]就是代表了顺序号,说白了,就是因为不熟悉list的add操作,
list的void add(int index, E element)用法,
主要用于在列表的指定位置插入指定元素element

最后的最后,真心觉得有个大佬这样实践一下特别有意思,推荐给大家,特别的清楚明了

排序后:[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]
遍历插入:
[7,0]
[7,0], [7,1]
[7,0], [6,1], [7,1]
[5,0], [7,0], [6,1], [7,1]
[5,0], [7,0], [5,2], [6,1], [7,1]
[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]

大佬的博客在这里,也很棒,大家有空也可以看下这个
https://blog.csdn.net/qq_20304723/article/details/102647178

不懂的还有很多,和大家一起进步!

猜你喜欢

转载自blog.csdn.net/weixin_45806131/article/details/106610111