406. 根据身高重建队列

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

示例 1:

输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
解释:
编号为 0 的人身高为 5 ,没有身高更高或者相同的人排在他前面。
编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。
编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。
编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。
编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。
示例 2:

输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]
输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]
 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/queue-reconstruction-by-height
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

题目给了若干个数组,数组的第一个参数是第i个人的身高,第二个参数是第i个人前面有几个比自己高的人,根据题目要求,可以想到按照每个人的身高从高到低排序,再依次遍历每个人的第二个参数k,之所以先根据人的身高从低到高排序是为了遍历到某人的k值时直接将其移到第k个位置,因为身高是从高到低排的,所以移到数组下标为k的位置那么他前面就刚好有k个比他高的人,即使再向后。

那分析到这里可以意识到,一开始遗漏掉了题目里的另一个条件,题目给的k的含义是排在当前位置的人前面有k个大于或等于当前位置人的身高的数量,开始没注意到这个等于的条件导致一些用例测试错误。

输入:       [[9,0],[7,0],[1,9],[3,0],[2,7],[5,3],[6,0],[3,4],[6,2],[5,2]]

输出:       [[3,0],[6,0],[7,0],[5,2],[3,4],[6,2],[5,3],[2,7],[9,0],[1,9]]

预期结果:[[3,0],[6,0],[7,0],[5,2],[3,4],[5,3],[6,2],[2,7],[9,0],[1,9]]

 找到问题之后,将相同身高的人按照其k值的大小从低到高排序便解决了这个问题。

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, new Comparator() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] > o2[0] ? -1 : (o1[0] == o2[0])&&(o1[1] < o2[1]) ? -1 : 1;
            }
        });

        int length = people.length;
        for (int i = 0; i < length; i++) {
            insertPeople(i, people[i][1], people);
        }
        return people;
    }

    public void insertPeople(int sour, int dest, int[][] people) {
        int sourH = people[sour][0];
        int sourK = people[sour][1];

        for (int i = sour; i > dest; --i) {
            people[i][0] = people[i - 1][0];
            people[i][1] = people[i - 1][1];
        }
        people[dest][0] = sourH;
        people[dest][1] = sourK;
    }
}

 另一种排序的方法

Arrays.sort(people, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]);

406. 根据身高重建队列_第1张图片

 

方法二:List进行插值

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 queue = new ArrayList();
        int length = people.length;
        for(int[] p:people){
            queue.add(p[1],p);//根据k把p插到对应的序号
        }
        return queue.toArray(new int[people.length][2]);
    }
}

406. 根据身高重建队列_第2张图片

优化排序

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, new Comparator() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] > o2[0] ? -1 : (o1[0] == o2[0]) && (o1[1] < o2[1]) ? -1 : 1;
            }
        });

        List queue = new ArrayList();
        int length = people.length;
        for(int[] p:people){
            queue.add(p[1],p);//根据k把p插到对应的序号
        }
        return queue.toArray(new int[people.length][2]);
    }
}

406. 根据身高重建队列_第3张图片

 

你可能感兴趣的:(Leetcode,贪心思想,leetcode,算法,职场和发展)