【力扣刷题笔记】贪心算法-406. 根据身高重建队列

题目

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

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

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

思路

我一开始的想法是,先根据身高进行从高到低排序,然后根据k值进行从小到大排序,贪心的去求解。
根据其他人的说法,这类的题的总结是:

根据代码随想录所学,对于这种有两个维度一起出现的,一般都是先确定一边,然后对另外一个边进行贪心。


感觉本身不是很难,虽然有的说比那个135.分发糖果难,但是我是反而这个更容易想到先处理身高,再处理K值,可能是因为我刚做完“分发糖果”,举一反三比较厉害,hhh。记录的原因主要是因为,Java的比较器的重写不太熟练,以及ArrayList方法add(int index, E element)这个index参数,在数组中的情况没咋见过。

代码实现:来自LeetCode官方题解

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, new Comparator<int[]>() {
            public int compare(int[] person1, int[] person2) {
                if (person1[0] != person2[0]) {
                    return person2[0] - person1[0];
                } else {
                    return person1[1] - person2[1];
                }
            }
        });
        //Arrays.sort(people, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]); //也可以是lambda函数实现比较重载
        List<int[]> ans = new ArrayList<int[]>();
        for (int[] person : people) {
            ans.add(person[1], person);
           // System.out.println(person[1]);
        }
        return ans.toArray(new int[ans.size()][]);
    }
}

代码解释和API学习:

  • 比较器重载:直接方法重写,整个整体作为Arrays.sort()的参数。
  • 二维数组重排,Comparator的参数就是一维数组,一维数组的参数就是int。
  • person1[0] != person2[0] : 数组的0号位值不相同,就return person2[0] - person1[0] :后 - 前,就是按0号索引值,从大到小。本题中就是,身高从高到低。
  • 相同情况,就return person1[1] - person2[1]: 按元素一维数组的1号索引位置从小到大排。
  • ans.add()中,就是add(int index, E element)。插入的元素就是 person这个数组地址(每个行数组,一插就是一行,数组名就是数组地址)。插入的index 位置就是 person[1] 第二列代表的值,本题中就是前面有几个比当前高的值。
  • 最后是List 转成数组:toArray():
    • arraylist.toArray(T[] arr):
    • T [] arr(可选参数)- 用于存储数组元素的数组,这里 T 指的是数组的类型。
    • 如果参数 T[] arr 作为参数传入到方法,则返回 T 类型的数组。如果未传入参数,则返回 Object 类型的数组。
    • 这里参数是:new int[行数][]一个二维数组。

人类可真奇怪,明明赚钱不开心嘛,那为啥还要赚钱呀 ——熊二

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值