LeetCode: 406. 根据身高重建队列

406. 根据身高重建队列

思路

先安置较高的,再安置较矮的。

由于每个人只能看与自己同高或更高的。也就是说较高者的k值,不受较矮者的影响。

那么,我们如果先按照身高进行排序之后,每次取出输入序列中的最高者。

那么已安排序列中所有人的身高一定都比当前输入者的身高要高。那么,输入者的k值一定放到已安排序列中第k个一定是符合顺序的。

原题输入: [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],根据k值放置
    输入序列: [7,1],[6,1],[5,0],[5,2],[4,4]
    安排序列: [7,0]

  • 放入[7,1]
    输入序列: [6,1],[5,0],[5,2],[4,4]
    安排序列: [7,0],[7,1]

  • 放入[6,1],与已经存在的[7,1]存在冲突,由于7 > 6, 因此可以将[7,1]往后挪
    输入序列: [5,0],[5,2],[4,4]
    安排序列: [7,0],[6,1],[7,1]

  • 放入 [5,0], 同上冲突, 由于所有数都比[5,0]大,我们可以将它们任意挪动,而不影响它们的k值
    输入序列: [5,2],[4,4]
    安排序列: [5,0], [7,0],[6,1],[7,1]

  • 放入 [5,2],
    输入序列: [4,4]
    安排序列: [5,0],[7,0],[5,2],[6,1],[7,1]

  • 放入[4,4]
    输入序列: []
    安排序列: [5,0],[7,0],[5,2],[6,1],[4,4],[7,1],

实现

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        std::sort(people.begin(), people.end(),
        [&](const auto &lhs, const auto& rhs){
            // h相等, k降序
            // h不等, h升序
            return lhs[0] == rhs[0] ? lhs[1] < rhs[1] : lhs[0] > rhs[0];
        });

 
        vector<vector<int>> tmp;
        for(int i = 0; i != people.size();++i){
            tmp.insert(tmp.begin() + people[i][1], people[i]);
        }
        return tmp;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值