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

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

一、根据身高重建队列

题目为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。

完整代码为:

cpp 复制代码
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),当且仅当每个相邻位数上的数字 xy 满足 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类型。

完整代码如下:

cpp 复制代码
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);
    }
};

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

相关推荐
phoenix@Capricornus8 分钟前
从统计决策到贝叶斯估计
人工智能·算法·机器学习
AICDragon16 分钟前
1.8%就够了:K3的896个MoE专家,为什么激活率这么低反而是好事?
人工智能·算法
VALENIAN瓦伦尼安教学设备36 分钟前
ASHOOTER激光对中仪如何通过颜色确定调整是否合适
数据库·嵌入式硬件·算法
货拉拉技术36 分钟前
重塑 Agent 度量衡:基于 LLM-as-a-Judge 的离线评估体系与实践
算法·设计模式
车压1 小时前
从“为什么”理解注意力机制
算法
wabs6661 小时前
关于哈希表【力扣15.三数之和的思考】
数据结构·算法·leetcode·散列表·哈希表·三数之和
退休倒计时1 小时前
【每日一题】LeetCode 88. 合并两个有序数组 TypeScript
算法·leetcode·职场和发展·typescript
键盘会跳舞1 小时前
C++:函数对象与 std::function 源码级深度拆解——泛型算法的策略内核与可调用对象统一封装
c++·算法·仿函数
手写码匠1 小时前
华为云Flexus+DeepSeek征文|Agent 评测体系实战:用 DeepSeek-R1 当裁判,打造 Dify Agent 的自动化回归测试流水线
人工智能·深度学习·算法·aigc
LONGZETECH2 小时前
无人机实训高成本痛点解法:虚拟仿真实现 70% 耗材损耗下降
大数据·算法·unity·架构·无人机