Leetcode406. 根据身高重建队列[Med] -JAVA

题目传送门

Leetcode406. 根据身高重建队列[Med] -JAVA

题目

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来
重建这个队列。

注意:
总人数少于1100人。

示例

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

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

思路

k是排在这个人前面且身高大于或等于h的人数
因为people[i][1] 表示在我(i)前面需要比我(i)高的人的个数,那我先不管3721,反正大家想要前面都比自己高的,直接按照从高到矮(大到小)的顺序排一遍先。
如果相同的高度就按个数的小-大排,这个应该很好理解,越排后面那我前面就多点人,这样之后还没完。

待排好后再做个调整,按照people[i][1]的顺序重组一个数数组,相同位置就插在这个位置的人的前面。这里用了List.add(index,element)这个方法可以实现。
因为当前的数肯定是比前面小或者等于前面,前面的数已有了它该有的位置,那这些在不破坏规则的情况下,当前的值选择插在前面。

完成!

ps:List.add(index,element)实现的关键代码System.arraycopy(elementData, index, elementData, index + 1,size - index)
即重新复制一份数组,把index+1 后面的元素后移动,腾出一个新位置给新元素。

栗子:
走一波程序!!!
数组:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
第一步排好之后会变成这样: [[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]
第二步: 新数组List []
第一个[7,0] ,位置为index =0 , 数组有了第一个元素:[[7,0]]
第二个[7,1] ,位置为index =1 , 数组有了第二个元素:[[7,0],[7,1]]
第三个[6,1] ,位置为index =1 , 数组有了第三个元素:[[7,0],[6,1],[7,1]]
第四个[5,0] ,位置为index =0 , 数组有了第四个元素:[[5,0],[7,0],[6,1],[7,1]]
第五个[5,2] ,位置为index =2 , 数组有了第五个元素:[[5,0],[7,0],[5,2],[6,1],[7,1]]
第六个[4,4] ,位置为index =4 , 数组有了第六个元素:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

解法

贪心算法

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        if(people.length==0|| people[0].length==0) return new int[0][0];
        Arrays.sort(people, (o1, o2) -> o1[0]==o2[0]?o1[1]-o2[1]:o2[0]-o1[0]); // java8后lamda写法,等价于new Competitor<>(){...}

        List<int[]> res = new ArrayList<>();
        for (int[] person : people) {
            res.add(person[1],person);
        }

        return res.toArray(new int[res.size()][]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值