首页 > 其他分享 >406.根据身高重建队列

406.根据身高重建队列

时间:2023-05-08 16:14:34浏览次数:28  
标签:return people 队列 406 int vector que 身高

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

示例 1:

输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
解释:
编号为 0 的人身高为 5 ,没有身高更高或者相同的人排在他前面。
编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。
编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。
编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。
编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。
//我的解法

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        int len = people.size();
        if(len == 1) return people;
        vector<vector<int>> res(len,vector<int>(2,0));
        std::sort(people.begin(),people.end(),
        [](vector<int> &lhs,vector<int> &rhs)->bool
        {
            if(lhs[0] != rhs[0]){
                return lhs[0] < rhs[0];
            }
            else{
                return lhs[1] < rhs[1];
            }
        });
        res[people[0][1]] = people[0];
        for(int i = 1; i < len; i++){
            int loc = people[i][1];
            for(int j = 0; j <= loc;j++){
                if(people[j][0] && people[j][0] < people[i][0]){
                    loc++;
                }
            }
            res[loc] = people[i];
        }
        return res;
    }
};

//标准解法一
// 因为身高低不会影响身高高的排序结果
// 所以现将队列排序,将高个子排在前面,相同身高的k小的站前面
// 然后根据k依次进行插入即可
class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] > b[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort (people.begin(), people.end(), cmp);
        vector<vector<int>> que;
        for (int i = 0; i < people.size(); i++) {
            int position = people[i][1];
            que.insert(que.begin() + position, people[i]);
        }
        return que;
    }
};

// 标准解法二
// 对列插入的时间复杂度低,所以改用队列 list底层为链表
class Solution {
public:
    // 身高从大到小排(身高相同k小的站前面)
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] > b[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort (people.begin(), people.end(), cmp);
        std::list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多
        for (int i = 0; i < people.size(); i++) {
            int position = people[i][1]; // 插入到下标为position的位置
            std::list<vector<int>>::iterator it = que.begin();
            while (position--) { // 寻找在插入位置
                it++;
            }
            que.insert(it, people[i]);
        }
        return vector<vector<int>>(que.begin(), que.end());
    }
};

标签:return,people,队列,406,int,vector,que,身高
From: https://www.cnblogs.com/lihaoxiang/p/17382079.html

相关文章

  • 在一个进程中通过队列的方式缓存opencv视频帧,并在另一个进程中读取
    import_threadimportqueueimporttimeimportcv2fromflaskimportFlask,Responseapp=Flask(__name__)max_size=3q1=queue.Queue(maxsize=max_size)q2=queue.Queue(maxsize=max_size)open_flag=1defopen_and_show(ip_camera_url,title):......
  • spring mvc 报406错误
    我也不知道真正的原因是什么,可能是返回的格式不正确吧,猜测而已,因为之前返回的是Map,这样不行,改为返回字符串String就可以了.原因是缺少jar包,详见http://jadethao.iteye.com/blog/1926525http://macrotea.iteye.com/blog/1179509......
  • 【数据结构】单调队列专题(滑动窗口问题)
    一维滑动窗口154.滑动窗口下标从0开始,数组模拟队列#include<iostream>usingnamespacestd;constintN=1e6+10;intn,k;inta[N],q[N];intmain(){scanf("%d%d",&n,&k);for(inti=0;i<n;i++)scanf("%d",&a......
  • 消息队列Rabbitmq介绍、rabbitmq安装、基于queue实现生产者消费者、基本使用、消息安
    目录1消息队列Rabbitmq介绍2rabbitmq安装3基于queue实现生产者消费者4基本使用4.1发送者4.2消费者5消息安全(详见笔记)6持久化(详见笔记)7闲置消费(详见笔记)8发布订阅(详见笔记)9发布订阅高级之Routing(按关键字匹配)(详见笔记)1消息队列Rabbitmq介绍#消息队列 -......
  • Redis定长队列设计与实现
    业务背景:只展示最近10条礼物打赏动态,用户名+礼物名称不管在app端还是在web端,或多或少都有这样的需求,所谓技术方案的选型都是受限于实际的业务场景的,都是以解决实际业务为目的,由于刚开始这样的需求还是比较少的,所以采用了简单的方式实现了功能,但是随着业务扩大,重复的也会很多,再写......
  • Celery - 分布式任务队列
    Celery-分布式任务队列目录Celery-分布式任务队列1celery简介1.1什么是celery1.2celery架构(1)消息中间件messagebroker(2)任务执行单元worker(3)任务结果存储taskresultstore(4)使用场景2Celery安装与使用2.1安装2.2快速使用①第1步:创建celeryapp与创建任务②第2步......
  • 消息队列
    sys/msg.h#include<sys/msg.h>intmain(void){//创建消息队列//通过key创建或获取消息队列返回消息队列ID失败返回-1/**msgget创建或获取消息队列*key:ftok函数返回的key*msgflg标志位置*0-获取不......
  • 云原生技术实践营「微服务X消息队列专场」
    微服务和消息队列都是当前比较流行的架构模式,可以帮助开发者在实际业务中解决大型复杂分布式系统面临的各种挑战:微服务架构是一种云原生架构方法,目的是提高系统的扩展性、可靠性和灵活性,它提倡将单一的应用程序划分成一组小的服务,服务之间互相协调、互相配合,每个服务运行在其独立......
  • c语言数据结构-----循环队列
    #include<stdio.h>#include<stdlib.h>#defineMAXSIZE10//循环队列长度为m-1时即为满typedefstruct{ intfront; intrear; int*base;}SqQueue;//初始化队列intInitQueue(SqQueue&q){ q.base=newint[MAXSIZE]; q.front=q.rear=0; return0;}//求队列长度int......
  • linux 内核 工作队列
    简介工作队列是将操作延期执行的另一种手段。因为它们是通过守护进程在用户上下文执行,函数可以睡眠任意长的时间。对每个工作队列来说,内核都会创建一个新的内核守护线程。新的工作队列通过调用 create_workqueue 或 create_workqueue_singlethread 函数来创建。前一个函数在......