[M贪心] lc406. 根据身高重建队列(贪心)

本文介绍了如何利用贪心策略解决LeetCode第406题——根据身高重建队列。首先对输入数据按身高降序排列,身高相同则按k升序排列。然后依次插入元素,确保每个元素前面的元素都比它高。通过示例详细解释了该过程,并给出了相应的C++代码实现。此外,还提及了树状数组和二分查找的解决方案作为补充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目来源

链接:lc406. 根据身高重建队列

2. 题目说明

在这里插入图片描述

3. 题目解析

太难了…

来自大佬的贪心思路:

  • 身高高的人只会看到比他高的人,所以当身高高的人固定好了位置,前面插入多少个矮的人都不会破坏高的人的条件限制
  • 所以应该先决定高的人的位置,再决定矮的人的位置;高的人限制条件少,矮的人限制条件多。

先按身高从大到小排序,身高一样则按照 k 排序:身高大或 k 小意味着限制条件少,应该被优先考虑。

依次插入元素:由上一点,先进入 res 的元素不会被后进入的元素影响,因此每一次插入只需要考虑自己不需要考虑别人。当遍历到元素 [a,b] 的时候,比它大的元素已经进组,比它小的元素还没进组,那么它应该插到 res 的第 b 位,从而实现 0 到 b-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]]

  • 插入 [7,0], res=[[7,0]]

  • 插入[7,1], res=[[7,0],[7,1]]

  • 插入[6,1], res=[[7,0],[6,1],[7,1]]

  • 插入[5,0], res=[[5,0],[7,0],[6,1],[7,1]]

  • 插入[5,2], res=[[5,0],[7,0],[5,2],[6,1],[7,1]]

  • 插入[4,4], res=[[5,0],[7,0],[5,2],[4,4],[6,1],[7,1]]

  • 最终答案是 [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

代码:

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(), [](const vector<int> &a, const vector<int> &b) {
            if (a[0] != b[0]) return a[0] > b[0];
            return a[1] < b[1];
        });

        vector<vector<int>> res;
        for (auto e : people) res.insert(res.begin() + e[1], e);
        return res;
    }
};

貌似还有个 树状数组+二分 的操作,不会。有兴趣可取看题解区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值