LeetCode-406-根据身高重建队列

图片

class Solution {
     /**
     * k(i)是第i个人前面有几个比第i个人高
     * 先是身高从高到低排序,再人数从低到高排序,这样可以保证当第i个人插入队列中时不会对前i个人产生影响,
     * 因为第i个若是比第i-1个矮则不会产生影响,若身高相等,则第i个人的k(i)大于第i-1,则会落入
     * 第i-1个人的后面
     */
    public static 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];
                } else {
                    return person1[1] - person2[1];
                }
            }
        });
        List<int[]> ans = new ArrayList<int[]>();
        for (int[] person : people) {
            ans.add(person[1], person);
        }
        return ans.toArray(new int[ans.size()][]);
    }
}
class Solution {
     /**
     * k(i)是第i个人前面有几个比第i个人高
     * 先是按照k(i)排序从低到高,再按照身高排序从低到高
     * 把第i个人插入到比他高的第k(i)+1的左边相邻位置,
     * 若无,则插到队尾,保证了第i个人不会对前i-2个人产生影响
     * (因为此时第i-1个人的k(i)可能还没满足,因此不能保证第i个人不会对第i-1个人产生影响
     */
    public static int[][] reconstructQueue(int[][] people) {
        if (people.length == 0) {
            return people;
        }
        Arrays.sort(people, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[1] == o2[1]) {
                    return o1[0]-o2[0];
                }
                return o1[1] - o2[1];
            }
        });
        List<int []> list = new LinkedList<>();
        list.add(0, people[0]);
        for (int i = 1; i < people.length; i++) {
            int maxs = 0;
            int size = list.size();
            for (int j = 0; j < size; j++) {
                if (people[i][0] <= list.get(j)[0]) {
                    maxs++;
                }
                if (people[i][1] == maxs-1) {
                    list.add(j, people[i]);
                    break;
                }
                if (j == list.size()-1) {
                    list.add(j+1, people[i]);
                    break;
                }
            }
        }
        int [][]result = new int[people.length][2];
        int size = list.size();
        for (int i = 0; i < size; i++) {
            result[i] = list.get(i);
        }
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值