IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode 406. 根据身高重建队列 详细注解 -> 正文阅读

[数据结构与算法]leetcode 406. 根据身高重建队列 详细注解

题目链接

算法一

贪心+树状数组+二分

时间复杂度O(nlog^2(n))

思路

先放身高最小的,然后剩余的都是身高比它大的,之前放的身高更小的不需要在考虑了,如果相等放位次高的,这样位次低的不受影响,这里用树状数组统计有几个空余位置即没放的位置,这些位置将要放的人身高一定比当前身高高,所以对应位次就是前边有几个空白位置。

C++ 代码

class Solution {
public:
    int n;
    vector<int>tr;
    int lowbit(int x)
    {
        return x&-x;
    }
    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;i-=lowbit(i))res+=tr[i];
        return res;
    }
    //对于身高从小往大排,对于位次从大往小排
    static bool cmp(vector<int> a,vector<int> b)
    {
        if(a[0]!=b[0])return a[0]<b[0];
        else return a[1]>b[1];
    }
    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(),cmp);
        
        for(auto p:people)
        {
            int l=1,r=n;
            while(l<r)
            {
                int mid=(l+r)/2;
                if(mid-query(mid)>=p[1]+1)r=mid;
                else l=mid+1;
            }
            res[r-1]=p;
            add(r,1);
        }
        return res;
    }
};

算法二

贪心O

复杂度O(n^2)

思路

先放身高高的,这样身高低的不会对其有所影响,如果相等放位次低的,位次即所在位置,然后类似于滑动窗口,对每个人往里边插到合适位置即可

class Solution {
public:
    static bool cmp(vector<int>a,vector<int>b)
    {
        if(a[0]!=b[0])return a[0]>b[0];
        return a[1]<b[1];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
    int n=people.size();
    sort(people.begin(), people.end(), cmp);
    vector<vector<int>> res;
    for(auto p:people) res.insert(res.begin()+p[1],p);
    return res;
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-08 12:01:22  更:2021-10-08 12:01:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 10:02:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码