算法整理——【贪心算法练习(2)】

news/2024/10/7 14:36:15/

我们继续对贪心算法进行练习,积累题目经验。

一、根据身高重建队列

题目为406. 根据身高重建队列 - 力扣(LeetCode),假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面正好有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

本题有两个维度的参数:身高和排位。我们遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。比如这道题,我们可以先按照身高进行排序,身高从高到低排序,身高相同则排位靠前的排在前面。此时,只需要把排序为k的人插入第k个位置即可,因为此时身高已经从高到低排序了,站在他前面的就是比他高的。

此处排序函数sort需要自定义排序规则。我们定义cmp函数,为static bool cmp(),参数类型为const vector<int>&。如果符合排序要求则返回1,不符合则返回0。

完整代码为:

class Solution {
public:static bool cmp(const vector<int>& a, const vector<int>& b){if(a[0]>b[0]){return 1;}else if(a[0]<b[0]){return 0;}else{return a[1]<b[1];}}vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(),people.end(),cmp);vector<vector<int>> ret;for(int i = 0; i<people.size(); i++){int pos = people[i][1];ret.insert(ret.begin()+pos, people[i]);}return ret;}
};

二、单调递增的数字

题目为738. 单调递增的数字 - 力扣(LeetCode),当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈单调递增

思路简单来说就是遍历每一位,如果前一位小于后一位则满足条件,前一位大于后一位则需要前一位减一,后一位变成9。但有几点需要注意的地方,首先是遍历顺序,如果从前往后遍历,例如332,遍历到3>2时,会发现需要把3减到2,2变为9,结果变成了329。这并不符合要求。我们应该从后往前遍历。然后还有一个问题,比如我们目前的思路时从后往前遍历,前一位大于后一位则前一位--,后一位变成9,此时如果遇到101这种数,会处理得到91。这并不对,我们应该把接收减一操作的数的后面的数都变成9这样才是最大的结果。所以我需要进行修改,对前一位大于后一位情况出现时,对前一位的位置进行记录,然后后面统一把该位以后的所有位都改为9即可。

另外,本题使用了to_string()函数实现Int类型转string,以及stoi()函数实现string类型转int类型。

完整代码如下:

class Solution {
public:int monotoneIncreasingDigits(int n) {string str = to_string(n);int pos = -1;for(int i = str.size()-1; i>0; i--){if(str[i]<str[i-1]){pos = i;str[i-1]--;}}if(pos!=-1){for(int i = pos; i<str.size(); i++){str[i]='9';}}return stoi(str);}
};

说明:本文为作者整理知识点用于复习巩固,参考了代码随想录的讲解,有问题可以联系作者欢迎讨论~


http://www.ppmy.cn/news/1474057.html

相关文章

【区分vue2和vue3下的element UI Steps 步骤条组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 和 Vue 3 中&#xff0c;Element UI&#xff08;针对 Vue 2&#xff09;和 Element Plus&#xff08;针对 Vue 3&#xff09;提供了 Steps 步骤条组件&#xff0c;用于展示当前操作的进度步骤。虽然这两个库都提供了步骤条组件&#xff0c;但它们在属性、事件和方法的…

【观察】三合实业X华为:十载风雨同舟路,奋楫逐浪向未来

十年前&#xff0c;广东三合电子实业有限公司&#xff08;以下简称&#xff1a;三合实业&#xff09;正式成立&#xff0c;同年成为华为金牌伙伴&#xff0c;由此也开启了与华为深度“结缘”的十年。 十年来&#xff0c;作为华为“铁杆”的合作伙伴&#xff0c;三合实业始终与华…

el-date-picker 开始时间选定后,结束时间不可选择开始时间之前的日期

<el-date-pickerv-model"startTime"name"startTime"value-format"yyyy-MM-dd"type"date"change"activityStartTime"placeholder"请选择开始日期":picker-options"pickerOptions"/> <el-date-p…

【高等数学】第四章习题:多元函数微分学及其运用

文章目录 一. 微分方程二. 多元函数微分学1. 多元函数基本概念1.1. 二元函数的连续性1.2. 偏导数1.3. 求极限1.4. 全微分 2. 多元函数微分法2.1. 复合函数求偏导2.2. 隐函数微分法 3. 多元函数的极值与最值3.1. 无条件极值3.2. 拉格朗日乘数法 一. 微分方程 二. 多元函数微分学…

深度解析移动硬盘“函数不正确”错误及高效恢复策略

在数据密集型的社会中&#xff0c;移动硬盘作为移动存储的重要载体&#xff0c;承载着无数用户的个人信息、工作资料及珍贵回忆。然而&#xff0c;当遭遇“函数不正确”的错误时&#xff0c;这些宝贵的数据仿佛被一层无形的屏障所阻隔&#xff0c;让人束手无策。本文将深入探讨…

Apache Doris的分区与分桶原理解析

介绍 在 Apache Doris 中,“分区”和“分桶”是两种用于管理和优化数据的技术,分别解决不同的数据存储和查询优化问题。 在 Doris 中,数据都以表(Table)的形式进行逻辑上的描述。 Row & Column 一张表包括行(Row)和列(Column): Row:即用户的一行数据; Colu…

案例精选 | 聚铭综合日志分析系统为江苏省电子口岸构建高效安全的贸易生态

江苏省电子口岸有限公司&#xff0c;成立于2009年&#xff0c;由江苏省贸促会携手南京海关、江苏检验检疫局及江苏海事局等部门共同出资组建。公司承载着推动江苏乃至长三角地区国际贸易便利化的重大使命&#xff0c;致力于打造一个集先进性、创新性、高效性于一体的电子口岸综…

Unity3D 场景树与组件化开发详解

Unity3D是一款功能强大的游戏开发引擎&#xff0c;其独特的场景树和组件化开发模式为开发者提供了高效、灵活的游戏开发体验。本文将详细解析Unity3D中的场景树与组件化开发模式&#xff0c;并给出相应的技术详解和代码实现。 对惹&#xff0c;这里有一个游戏开发交流小组&…