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

ops/2024/10/20 6:39:03/

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

一、根据身高重建队列

题目为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/ops/56060.html

相关文章

git上传文件

git init git add . git commit -m " " git remote add origin 仓库的地址 git push -u origin master 如果出现以下问题 可以用这一句强制上传 git push -f origin master

golang 模板引擎常用语法

golang 模板常用语法 1、变量赋值 Action里可以初始化一个变量来捕获管道的执行结果。初始化语法如下&#xff1a; 其中$variable是变量的名字。声明变量的action不会产生任何输出。 {{$variable : pipeline}}福利彩蛋&#xff1a;没有好玩的 API 接口&#xff1f;上百款免费接…

字节码编程javassist之打印方法耗时和入参

写在前面 本文看下如何实现打印方法耗时和入参。 1&#xff1a;程序 需要增强的类&#xff1a; public class ApiTest1 {public Integer strToInt(String str01, String str02) {return Integer.parseInt(str01);}}插桩类 package com.dahuyou.javassist.huohuo.aa;import…

LeetCode377. 组合总和 Ⅳ

为何先遍历背包、后遍历物品&#xff0c;得到的是排列数呢&#xff1f; 以本题为例&#xff1a;&#xff08;背包容量用j表示&#xff0c;选择的物品下标用i表示&#xff09; j为1时&#xff1a; i0&#xff0c;表示把nums[0]放置在该集合的最后一个元素的位置 那么所得集合为…

2024年最适合高级网工的11款Linux

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好&#xff0c;我的网工朋友。 Linux作为一个免费且开源的操作系统&#xff0c;随着时间的推移催生了多个发行版&#xff0c;并且得到了庞大…

【EI稳定检索】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

>>>【独立出版&#xff0c;Ei稳定检索】<<< 第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09; 2024年09月20-22日 | 中国温州 一轮截稿时间&#xff1a;2024年7月8日 二轮截稿时间&#xff1a;2024年8月5日 大会简介 *会议…

C#常用关键字举例

关键字是 C# 编译器预定义的保留字。这些关键字不能用作标识符&#xff0c;但是&#xff0c;如果您想使用这些关键字作为标识符&#xff0c;可以在关键字前面加上 字符作为前缀。 class: public class MyClass {// Class definition }interface: public interface IMyInterfac…

Linux服务器集群搭建

Linux服务器搭建 配置网络和主机名 查看虚拟机虚拟网卡ip信息 在NAT设置中查看网关地址 具体的ip根据网关网段设置 设置root账户密码&#xff0c;越简单越好 修改网卡信息 修改网卡配置&#xff0c;改成静态ip的方式 修改ip为静态方式 修改过后重启网卡服务 关闭防火墙…