LeetCode:根据身高重建队列

LeetCode:根据身高重建队列

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对 (h, k) 表示,其中 h 是这个人的身高,k 是应该排在这个人前面且身高大于或等于 h 的人数。 例如:[5,2] 表示前面应该有 2 个身高大于等于 5 的人,而 [5,0] 表示前面不应该存在身高大于等于 5 的人。

编写一个算法,根据每个人的身高 h 重建这个队列,使之满足每个整数对 (h, k) 中对人数 k 的要求。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
其实刚开始这个题一点思路也没有,但是我看了LeahChao写的题解。上面说一般这种数对,还涉及排序,根据第一个元素正向排序,根据第二个元素反向排序。或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化过程。上面的动画演示也可以让人理解。

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

        List<int[]> list = new ArrayList<>();
        //res的长度如果大于要插入的k值,那么就将要插入的数插入到k值得位置,若res的长度小于要插入的k值,则直接插入
        for(int[] p :people){
            if(list.size()<=p[1]){
                list.add(p);
            }else{
                list.add(p[1],p);
            }
        }

        return list.toArray(new int[list.size()][]);

    }

}

下面的方式则是参照镐锝铼氪的评论编写代码。将二维数组按第一个值升序排序,第二个值降序排序。当前这个人如果是剩下还没安排的人中最矮的人,它的K值就代表它在剩余空位的索引值。如果多个人身高相同,则按K值从大到小领取索引值示例。
[ 0, 1, 2, 3, 4, 5 ] [ 4, 4 ] 4
[ 0, 1, 2, 3, 5 ] [ 5, 2 ] 2
[ 0, 1, 3, 5 ] [ 5, 0 ] 0
[ 1, 3, 5 ] [ 6, 1 ] 3
[ 1, 5 ] [ 7, 1 ] 5
[ 1 ] [ 7, 0 ] 1
[ [ 5, 0 ], [ 7, 0 ], [ 5, 2 ], [ 6, 1 ], [ 4, 4 ], [ 7, 1 ] ]

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        int len = people.length;
        int[][] res = new int[len][2];
        Arrays.sort(people,new Comparator<int[]>(){
            public int compare(int[] a,int[] b){
                return a[0]==b[0]?b[1]-a[1]:a[0]-b[0];
            }
        });
        
        List<int[]> list = new ArrayList<>();
        //a数组初始为0代表结果二维数组中还未插入值
        int[] a = new int[len];
        for(int[] p :people){
            int n = p[1];
            for(int i=0;i<len;i++){
                if(a[i]==0){
                //当n小于等于0可以判断该位置是要插入的位置
                    if(n<=0){
                        a[i]=1;
                        res[i] = p;
                        break;
                    }
                    n--;
                }
            } 
            // if(list.size()<=p[1]){
            //     list.add(p);
            // }else{
            //     list.add(p[1],p);
            // }

        }

        return res;

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值