ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 406. 根据身高建队列

2021-11-17 11:59:49  阅读:187  来源: 互联网

标签:return people 队列 res mid 406 int 身高 LeetCode


在这里插入图片描述

算法:贪心+排序+二分+树状数组

时间复杂度:O(nlognlogn)

每 次 挑 选 当 前 还 未 确 定 位 置 的 人 中 的 最 低 身 高 的 人 , 每次挑选当前还未确定位置的人中的最低身高的人, 每次挑选当前还未确定位置的人中的最低身高的人,
如 果 身 高 相 同 则 挑 选 排 在 他 前 面 的 人 数 多 的 人 , 这 样 , 如果身高相同则挑选排在他前面的人数多的人,这样, 如果身高相同则挑选排在他前面的人数多的人,这样,
在 放 置 他 的 位 置 时 , 以 前 放 置 的 人 的 位 置 不 会 对 他 当 前 放 置 的 在放置他的位置时,以前放置的人的位置不会对他当前放置的 在放置他的位置时,以前放置的人的位置不会对他当前放置的
位 置 有 任 何 影 响 , 假 如 当 前 选 中 的 人 前 面 的 人 大 于 等 于 他 的 身 高 的 位置有任何影响,假如当前选中的人前面的人大于等于他的身高的 位置有任何影响,假如当前选中的人前面的人大于等于他的身高的
有 k 个 人 , 则 他 应 该 放 在 空 位 置 的 第 k + 1 位 , 我 们 可 以 使 用 二 分 + 树 状 数 组 优 化 。 有k个人,则他应该放在空位置的第k+1位,我们可以使用二分+树状数组优化。 有k个人,则他应该放在空位置的第k+1位,我们可以使用二分+树状数组优化。

class Solution {
public:
    vector<int>tr;
    int n;
    int lowbit(int n){
        return n & -n;
    }
    void add(int x, int v){
        for(int i = x; i <= n; i+=lowbit(i))
            tr[i] += v;
    }
    int query(int x){
        int res = 0;
        for(int i = x; i >= 1; i -= lowbit(i))  res += tr[i];
        return res;
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        n = people.size();
        tr.resize(n+1);
        vector<vector<int>>res(n);
        sort(people.begin(), people.end(), [](vector<int>a, vector<int>b){
            if(a[0] != b[0])    return a[0] < b[0];
            return a[1] > b[1];
        });
        for(auto x : people){
            int h = x[0], k = x[1];
            int l = 1, r = n;
            while(l < r)
            {
                int mid = l + r >> 1;
                if(mid - query(mid) >= k + 1)   r = mid;
                else                            l = mid + 1;
            }
            res[l-1] = x;
            add(l, 1);
        }
        return res;
    }
};

作者:陈平安
链接:https://www.acwing.com/activity/content/code/content/2020650/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:return,people,队列,res,mid,406,int,身高,LeetCode
来源: https://blog.csdn.net/qq_50313418/article/details/121374942

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有