406. 根据身高重建队列

题目

找规律

这种排队列的题,基本上都跟排序有关,因此先对原始序列排个序:

  • 找规律,发现队列基本上是按照 k i k_i ki 排的;
  • k i k_i ki 相同时,考虑将矮个子放在前面;

找完了大致的规律,现在来考虑细节。考虑到队列的顺序不光是跟身高有关,还跟 k i k_i ki 有关,那么我们就将上面序列一个一个往队列中插:

  • 首先插入 [5,0]
  • 然后插入 [7,0] ,发现 [7,0] 意味着其前方没有比它大的数,那么就将它排在当前队列从头开始第一个比它高(或相等)的人前面,若没有则排在队尾。此时队列为 [5,0], [7,0]
  • 然后插入 [6,1] ,发现 [6,1] 意味着其前方有一个比它高(或相等)的人,那么就将它排在第二个比它高(或相等)的人前面,若没有则排在队尾。此时队列为 [5,0], [7,0], [6,1]
  • 然后插入 [7,1] ,根据规律,将其排在第二个比它高(或相等)的人前面,若没有则排在队尾。此时队列为 [5,0], [7,0], [6,1], [7,1]
  • 然后插入 [5,2] ,根据规律,将其排在第三个比它高(或相等)的人前面,若没有则排在队尾。此时队列为 [5,0], [7,0], [5,2], [6,1], [7,1]
  • 后续操作相同,发现结果满足规律。
class Solution {
public:
    static bool cmp(const vector<int> &q, const vector<int> &p) {
        if(q[1] == p[1])
            return q[0] < p[0];
        return q[1] < p[1];
    }

    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(), cmp);
        vector<vector<int>> ans;
        ans.push_back(people[0]);
        for(int i = 1; i < people.size(); ++i) {
            int flag = 0;
            for(int j = 0;; ++j) {
                if(j == ans.size()) {
                    ans.push_back(people[i]);
                    break;
                }
                if(ans[j][0] >= people[i][0])
                    flag++;
                if(flag == people[i][1] + 1) {
                    ans.insert(ans.begin() + j, people[i]);
                    break;
                }
            }
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BeZer0

打赏一杯奶茶支持一下作者吧~~

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

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

打赏作者

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

抵扣说明:

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

余额充值