LeetCode刷题之406 根据身高重建队列(贪心算法)

news2025/1/16 19:55:29

题目描述

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

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

解题思路

  通过对题目的分析首先确定这是一个有两个维度的问题,一个是h(身高),一个是k(在前面比本身高或者相等的人数)。面对这种有两个维度的排序问题,首先要考虑确定一个维度,然后在对另一个维度进行排序。
  在这个题目中,我们使用排除法,如果先对人数进行排序再对身高进行排序,我们会发现对人数排序后身高是乱序的,对身高排序后人数又会变成乱序,所以本题选用确定身高序列,再进行人数操作。
  首先对身高进行排序,如果相同则人数少的在前,我们就可以写出这个比较器:

    // 有两个维度的这种问题,先确定一个维度再进行处理。
    // 按身高由大到小排序,相等的让K小的到前面,排完序后,再按顺序把每个结点插入到k的位置
    static bool compare(const vector<int>& v1,const vector<int>& v2){
        if (v1[0] == v2[0]){
            return v1[1] < v2[1];
        } 
        return v1[0] > v2[0];
    }

然后对人数进行排序处理,可以把每个结点的k当作再people数组中的index,因为现在的people已经是身高由大到小的序列了,如果按k的值进行插入,就可以得到满足要求的序列了。(贪心的思想,由局部最优推导到全局最优,用去反例的方法进行反证思路的正确性)可以写出如下代码:

vector<vector<int>> res;
        for(auto i : people){
            res.insert(res.begin()+i[1],i);
        }

此时可以看到代码的性能不是很理想,这主要是因为vector的插入操作是O(n^2)
在这里插入图片描述
因此把vector改为list:

list<vector<int>> res;
        for(auto i : people){
            list<vector<int>>::iterator it = res.begin();
            auto position = i[1];
            while(position--){
                it++;
            }
            res.insert(it,i);
        }
        return vector<vector<int>> (res.begin(),res.end());

在这里插入图片描述
可以看见性能得到了明显的提升。

解题代码

class Solution {
public:
    // 有两个维度的这种问题,先确定一个维度再进行处理。
    // 按身高由大到小排序,相等的让K小的到前面,排完序后,再按顺序把每个结点插入到k的位置
    static bool compare(const vector<int>& v1,const vector<int>& v2){
        if (v1[0] == v2[0]){
            return v1[1] < v2[1];
        } 
        return v1[0] > v2[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(),people.end(),compare);
        // vector<vector<int>> res;
        // for(auto i : people){
        //     res.insert(res.begin()+i[1],i);
        // }
        // return res;

        // 改成list实现
        // C++中list和forward_list的迭代器不支持加减运算,这是因为什么原因呢?
        // 那是因为双向链表和单向链表存储元素都不是在一块连续的内存上,所以无法通过加减法远距离查找元素。
        // for(auto i : people){
        //     res.insert(res.begin()++,i);
        // }
        list<vector<int>> res;
        for(auto i : people){
            list<vector<int>>::iterator it = res.begin();
            auto position = i[1];
            while(position--){
                it++;
            }
            res.insert(it,i);
        }
        return vector<vector<int>> (res.begin(),res.end());
    }
};

tips

1,C++中listforward_list的迭代器不支持长距离加减运算,这是因为双向链表和单向链表存储元素都不是在一块连续的内存上,所以无法通过加减法远距离查找元素
2,return vector<vector<int>> (res.begin(),res.end()); 这里使用了容器的拷贝复制技术,也可以用stl中的transform来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

元宇宙数字产品制作厂商广州华锐互动如何?

近两年&#xff0c;元宇宙引发全球的高度关注&#xff0c;很多玩家也都开始参与进来。作为虚拟世界的重要组成部分&#xff0c;元宇宙也从一个概念逐渐演变成了一种全新的商业模式以及行业发展趋势。 元宇宙具有极致沉浸和交互的体验&#xff0c;可以提升生活、工业、社会、科…

云原生之使用Docker部署OneNav个人书签管理器

云原生之使用Docker部署OneNav个人书签管理器一、OneNav介绍1.OneNav简介2.OneNav特点二、检查本地docker环境1.检查docker版本2.检查docker状态三、下载onenav镜像四、部署OneNav应用1.创建数据目录2.创建OneNav容器3.查看OneNav容器状态五、访问OneNav首页六、访问OneNav后台…

难受的这两天,你们怎么样?

12月23号周五&#xff0c;下班回来小云说中午下楼买菜碰到小区认识的一个妈妈&#xff0c;两个人在楼下聊了一会&#xff0c;晚上那个妈妈检测出阳性&#xff0c;周五晚上睡觉前&#xff0c;小云没任何不适&#xff0c;周末看朋友圈和小区已经很多很多人中招&#xff0c;我那时…

大数据系列——什么是hdfs?hdfs用来干什么的?

目录 一、什么是HDFS 二、hdfs用来干什么的 三、hdfs适用场景 四、hdfs不适合的场景 五、hdfs 架构 基本概念 六、HDFS基础命令 七、hdfs业务中应用 一、什么是HDFS HDFS全称是Hadoop Distributed File System是一种分布式文件系统(HDFS使用多台计算机存储文件&#xff…

易基因|深度综述:癌症中RNA修饰机制的遗传和表观遗传失调(m6A+m1A+m5C+ψ)

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2022年11月12日&#xff0c;《Trends Genet》杂志发表了题为“Genetic and epigenetic defects of the RNA modification machinery in cancer”的综述文章&#xff0c;讨论了m6A、m5C、…

CSS滤镜 filter 网站灰色设置

-webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: grayscale(100%); filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale1);例如&#xff1a; CSS滤镜 filter 详情链接 blu…

【K3s】第6篇 详解yaml文件,pod端口供外部访问

目录 1、yaml文件详解 2、pod 容器对外透露端口号 1、yaml文件详解 apiVersion: v1 #创建一个新的命名空间 kind: Namespace metadata:name: test --- apiVersion: apps/v1 #资源版本&#xff0c;可使用 kubectl api-versions命令查看有哪些&#xff0c;只有指定具体的资源…

嵌入式:ARM常用开发编译软件介绍

文章目录编译器介绍1、ADS1.22、ARM RealView Developer Suite (RVDS)3、IAR EWARM4、KEIL ARM-MDKARM5、WIN ARM-GCC ARM编译器介绍 1、ADS1.2 ADS&#xff08;ARM Developer Suite&#xff09;&#xff0c;是在1993年由Metrowerks公司开发是ARM处理器下最主要的开发工具。 他…

结合今年的考试难度浅析浙大MBA/MPA/MEM三项目的分数线趋势…

最近一些天&#xff0c;不少考生都在关注今年的分数线问题&#xff0c;按照往年惯例&#xff0c;这个问题的答案要等到3月10日前后才会出来&#xff0c;包括国家线和浙大自划线两个复试的标尺。但从历史数据和经验方面倒也可以提前针对这个问题做一些趋势分析&#xff0c;特别是…

client-go源码学习(一):client-go源码结构、Client客户端对象

本文基于Kubernetes v1.22.4版本进行源码学习&#xff0c;对应的client-go版本为v0.22.4 1、client-go源码结构 client-go的代码库已经集成到Kubernetes源码中了&#xff0c;源码结构示例如下&#xff1a; $ tree vendor/k8s.io/client-go -L 1 vendor/k8s.io/client-go ├─…

《业务安全大讲堂》——2022全年大回顾!

数字化的深入普及&#xff0c;让企业的业务愈加开放互联。企业的核心业务、关键数据、用户信息、基础设施、运营过程等均处于边界模糊且日益开放的环境中&#xff0c;在电商、支付、信贷、账户、交互、交易等各种形态的业务场景中&#xff0c;存在着形式多样的欺诈行为。而业务…

企业数字化转型迫切,团队协同工具何以成为“杀手锏”?

不久前&#xff0c;2022世界互联网大会乌镇峰会开幕&#xff0c;360创始人周鸿祎以“构建SaaS生态&#xff0c;助力数字化共同富裕”为主题发表分论坛演讲&#xff0c;并宣布360集团正式上线SaaS商店&#xff0c;为中小微企业和实体产业提供一站式数字化转型服务&#xff0c;填…

elasticsearch之metric聚合

文章目录1、背景2、准备数据2.1 准备mapping2.2 准备数据3、metric聚合3.1 max 平均值3.1.1 dsl3.1.2 java代码3.2 min最小值3.2.1 dsl3.2.2 java3.3 min最小值3.3.1 dsl3.3.2 java3.4 min最小值3.4.1 dsl3.4.2 java3.5 count(*)3.5.1 dsl3.5.2 java3.6 count(distinct)3.6.1 d…

一款非常萌的桌面工具 --- Bongo Cat Mver 附使用教程

最近看B站的时候发现了一个很好玩的桌面工具&#xff0c;Bongo Cat Mver 通过多方查找资源&#xff0c;终于找到了&#xff0c;并且已经下载使用 O(∩_∩)O 不知道这只小猫是不是特别好看呢&#xff1f;放在你的桌面上 Bongo Cat Mver简介 Bongo Cat Mver 是一款画风非常萌的…

[论文解析] NeRF-Art: Text-Driven Neural Radiance Fields Stylization

文章目录OverviewWhat problem is addressed in the paper?Is it a new problem? If so, why does it matter? If not, why does it still matter?What is the key to the solution?What is the main contribution?What can we learn from ablation studies&#xff1f;P…

vue3 路由 vite方式新建项目【适合新手】

一 配环境、并初始化项目 安装nodejs https://blog.csdn.net/lh155136/article/details/128444850 参考官网https://cn.vuejs.org/guide/quick-start.html#creating-a-vue-application 找个空目录cmd打开黑窗口 初始化项目 npm init vuelatest输入y 输入项目名字&#xff…

大聪明教你学Java | 带你了解 Binlog 实现 MySQL 主从同步的原理及实现方式

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

MYSQL性能分析

MYSQL性能分析 1.慢SQL查询 开启慢sql查询机制 set global slow_query_logon set global long_query_time2; set global log_queries_not_using_indexesonslow_query_log&#xff1a;慢查询log日志记录 on(开启)/off(关闭)&#xff1b; long_query_time:SQL语句执行时间超过2…

Django学习 Day8

1.查询语句 主要目的是学习在ORM中使用条件查询 Filter&#xff08;条件&#xff09; 语法&#xff1a; MyModel.objects.filter(属性1值1&#xff0c;属性2值2) 作用&#xff1a;返回包含此条件的全部数据集 返回值&#xff1a;QuerySet容器对象&#xff0c;内部存放MyModel实…

元旦礼!2022年国家高新技术企业

​近日&#xff0c;2022年度第一批高新技术企业证书已正式发放。根据《高新技术企业认定管理办法》&#xff08;国科发火〔2016〕32号&#xff09;和《高新技术企业认定管理工作指引》&#xff08;国科发火〔2016〕195号&#xff09;有关规定&#xff0c;北京市高新技术企业认定…