leetcode贪心算法题总结(三)

news2025/1/20 1:46:50

本章目录

  • 1.合并区间
  • 2.无重叠区间
  • 3.用最少数量的箭引爆气球
  • 4.整数替换
  • 5.俄罗斯套娃信封问题
  • 6.可被三整除的最大和
  • 7.距离相等的条形码
  • 8.重构字符串

1.合并区间

合并区间
在这里插入图片描述

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n = intervals.size();
        //先按左端点进行排序
        sort(intervals.begin(),intervals.end());
        int left = intervals[0][0],right = intervals[0][1];
        vector<vector<int>> ret;
        //进行区间合并
        for(int i=1;i<n;i++)
        {
            int a = intervals[i][0],b = intervals[i][1];
            if(a<=right) right = max(right,b);
            else
            {
                ret.push_back({left,right});
                left = a;
                right = b;
            }
        }
        ret.push_back({left,right});
        return ret;
    }
};

2.无重叠区间

无重叠区间
在这里插入图片描述

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        int n = intervals.size();
        //按照左端点进行排序
        sort(intervals.begin(),intervals.end());
        int ret = 0;
        //移除区间
        int left = intervals[0][0],right = intervals[0][1];
        for(int i=1;i<n;i++)
        {
            int a = intervals[i][0],b = intervals[i][1];
            if(a<right)
            {
                ret++;
                right = min(right,b);
            }
            else
            {
                right = b;
            }
        }
        return ret;
    }
};

3.用最少数量的箭引爆气球

用最少数量的箭引爆气球
在这里插入图片描述

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        int n = points.size();
        //按左端点进行排序
        sort(points.begin(),points.end());
        //求交集
        int ret = 0;
        int right = points[0][1];
        for(int i=1;i<n;i++)
        {
            int a = points[i][0],b = points[i][1];
            if(a<=right)
            {
                right = min(right,b);
            }
            else
            {
                ret++;
                right = b;
            }
        }
        return ret+1;//最后一个也需要一支箭
    }
};

4.整数替换

整数替换
在这里插入图片描述

class Solution {
    unordered_map<long long,long long> hash;//存储某一个数到1的最小步数
public:
    int integerReplacement(int n) {
        //法一:递归+记忆化搜索
        return dfs(n);
    }

    long long dfs(long long n)
    {
        if(hash.count(n)) return hash[n];
        if(n == 1)
        {
            hash[1] = 0;
            return hash[1];
        }
        if(n%2==0)
        {
            hash[n] = 1+dfs(n/2);
            return hash[n];
        }
        else
        {
            hash[n] = 1+min(dfs(n+1),dfs(n-1));
            return hash[n];
        }
    }
};
class Solution {
public:
    int integerReplacement(int n) {
        //法二:贪心+找规律
        int ret = 0;
        while(n>1)
        {
            if(n%2 == 0)
            {
                n /= 2;
                ret++;
            }
            else
            {
                if(n == 3) 
                {
                    ret += 2;
                    n =1;
                }
                else if(n%4 ==1)
                {
                    ret +=2;
                    n /=2;
                }
                else
                {
                    ret += 2;
                    n = n/2 +1;
                }
            }
        }
        return ret;
    }
};

5.俄罗斯套娃信封问题

俄罗斯套娃信封问题
在这里插入图片描述

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& e) {
        //法一:动态规划 O(n^2) 超时
        //状态表示:dp[i]表示:以i位置的信封为结尾的所有套娃序列中,最长的套娃序列的长度
        int n = e.size();
        vector<int> dp(n,1);
        sort(e.begin(),e.end());
        int ret = 1;
        for(int i=1;i<n;i++)
        {
            for(int j=0;j<i;j++)
            {
                if(e[i][0]>e[j][0]&&e[i][1]>e[j][1])
                {
                    dp[i] = max(dp[i],dp[j]+1);
                }
            }
            ret = max(ret,dp[i]);
        }
        return ret;
    }
};

在这里插入图片描述

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& e) {
        //法二:重写排序+贪心+二分
        int n = e.size();
        sort(e.begin(),e.end(),[&](const vector<int>& v1,const vector<int>& v2)
        {
            return v1[0]!=v2[0]?v1[0]<v2[0]:v1[1]>v2[1];
        });
        //此时问题转化成我们之前写过的最长递增子序列问题
        vector<int> ret;
        ret.push_back(e[0][1]);
        for(int i=1;i<n;i++)
        {
            int a = e[i][1];
            if(a>ret.back())
            {
                ret.push_back(a);
            }
            else
            {
                int left = 0,right = ret.size()-1;
                while(left<right)
                {
                    int mid = (left+right)>>1;
                    if(ret[mid]>=a) right = mid;
                    else left = mid+1;
                }
                ret[left] = a;
            }
        }
        return ret.size();
    }
};

6.可被三整除的最大和

可被三整除的最大和
在这里插入图片描述

class Solution {
public:
    int maxSumDivThree(vector<int>& nums) {
        //正难则反 
        //把所有的数都累加起来,根据累加和进行删除
        const int INF = 0x3f3f3f3f;
        int x1 = INF,x2 = INF,y1 = INF,y2 = INF,sum = 0;
        for(auto x:nums)
        {
            sum+=x;
            if(x%3 ==1)
            {
                if(x<x1)
                {
                    x2 = x1;
                    x1 = x;
                }
                else if(x<=x2)
                {
                    x2 = x;
                }
            }
            else if(x%3 ==2)
            {
                if(x<y1)
                {
                    y2 = y1;
                    y1 = x;
                }
                else if(x<=y2)
                {
                    y2 = x;
                }
            }
        }
        //分类讨论
        if(sum%3==0) return sum;
        else if(sum%3 ==1) return max(sum-x1,sum-y1-y2);
        else return max(sum-y1,sum-x1-x2);
    }
};

7.距离相等的条形码

距离相等的条形码
在这里插入图片描述

class Solution {
public:
    vector<int> rearrangeBarcodes(vector<int>& barcodes) {
        unordered_map<int,int> hash;//统计每个数字出现的次数
        int maxVal = 0,maxCount = 0;
        for(auto x:barcodes)
        {
            if(maxCount<++hash[x])
            {
                maxCount = hash[x];
                maxVal = x;
            }
        }
        //先处理出现次数最多的哪个数
        int n = barcodes.size();
        vector<int> ret(n);
        int index = 0;
        for(int i=0;i<maxCount;i++)
        {
            ret[index] = maxVal;
            index += 2;
        }
        //再处理其他的数
        hash.erase(maxVal);
        for(auto&[x,y] : hash)
        {
            for(int i=0;i<y;i++)
            {
                if(index>n-1) index = 1;
                ret[index] = x;
                index += 2;
            }
        }
        return ret;
    }
};

8.重构字符串

重构字符串
在这里插入图片描述

class Solution {
public:
    string reorganizeString(string s) {
        //模拟+贪心
        int hash[26] = {0};
        char maxChar = ' ';
        int maxCount = 0;
        for(auto x:s)
        {
            if(maxCount<++hash[x-'a'])
            {
                maxCount = hash[x-'a'];
                maxChar = x;
            }
        }
        //先判断
        int n = s.size();
        if(maxCount>(n+1)/2) return "";
        string ret(n,' ');
        int index = 0;
        //先处理出现次数最多的那个字符
        for(int i=0;i<maxCount;i++)
        {
            ret[index] = maxChar;
            index += 2;
        }
        //再处理其他字符
        hash[maxChar-'a'] = 0;
        for(int i=0;i<26;i++)
        {
            for(int j=0;j<hash[i];j++)
            {
                if(index>n-1) index = 1;
                ret[index] = 'a'+i;
                index += 2;
            }
        }
        return ret;
    }
};

这个系列到此就全部完啦,希望对您有所帮助,有什么不懂的可以直接私信我,我会为大家进行依次解答呀!

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

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

相关文章

图像的颜色及Halcon颜色空间转换transfrom_rgb/trans_to_rgb/create_color_trans lut

图像的颜色及Halcon颜色空间转换 文章目录 图像的颜色及Halcon颜色空间转换一. 图像的色彩空间1. RGB颜色 2. 灰度图像3. HSV/ HSI二. Bayer 图像三. 颜色空间的转换1. trans_from_rgb算子2. trans_to_rgb算子3. create_color_trans_lut算子 图像的颜色能真实地反映人眼所见的真…

地震烈度速报与预警工程成功案例的经验分享 | TDengine 技术培训班第一期成功落地

近日&#xff0c;涛思数据在成都开设了“国家地震烈度速报与预警工程数据库 TDengine、消息中间件 TMQ 技术培训班”&#xff0c;这次培训活动共分为三期&#xff0c;而本次活动是第一期。其目标是帮助参与者深入了解 TDengine 和 TMQ 的技术特点和应用场景&#xff0c;并学习如…

Github 2023-12-30 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-30统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量TypeScript项目4JavaScript项目2C项目1Python项目1Java项目1HTML项目1Dart项目1非开发语言项目1 令人惊叹的 …

(001)Unit 编译 UTF8JSON

文章目录 编译 Dll编译报错附录 编译 Dll 新建工程&#xff1a; 注意 UnityEngineDll 的选择&#xff01;2022 版本的太高了&#xff01;&#xff01;&#xff01; 下载包&#xff0c;导入unity : 3. 将 unf8json 的源码拷贝到新建的工程。 4. 编译发布版本&#xff1a; 编译…

浅层神经网络时间序列预测和建模

目录 时间序列网络 NARX 网络 NAR 网络 非线性输入-输出网络 定义问题 使用神经网络时间序列拟合时间序列数据 使用命令行函数拟合时间序列数据 选择数据 选择训练算法 创建网络 准备要训练的数据 划分数据 训练网络 测试网络 查看网络 分析结果 闭环网络 向…

数据的复制

基本概念 数据的复制指的是通过网络链接的多台机器保留相同的副本 为什么要进行数据的复制 使得用户和数据在地理上比较接近&#xff0c;因为大数据要求我们将计算安排在数据存放的位置和我们基本的内存模型不是很一样 &#xff0c;比如磁盘调入内存之类的。即使系统的一部分…

XTU-OJ-1452-完全平方数-笔记

参考博客 XTU-OJ 1452-完全平方数 题意 输入一个奇数&#xff0c;使得 n*(2*an-1)/2是一个完全平方数&#xff0c;求满足条件的最小的a 1<n<1e9 先输入样例数&#xff0c;再输入n 输入 2 1 3 输出 0 2 代码 #include<stdio.h>#define N 1000000010int a…

C#多条件排序OrderBy、ThenBy

方法和效果 有多个排序条件&#xff0c;其实不用单独自己写排序方法的&#xff0c;C#内置了排序方法&#xff1a; 引用命名空间System.Linq 正向排序的方法&#xff1a;OrderBy首要条件&#xff1b;ThenBy次要条件&#xff0c;可以连续多个使用 同理&#xff0c;逆向排序对应…

three.js绘制网波浪

无图不欢&#xff0c;先上图 使用方法&#xff08;以vue3为例&#xff09; <template><div class"net" ref"net"></div> </template><script setup> import { ref, onMounted } from vue import NetAnimation from /util…

面向搜索引擎优化初学者的 Google PageRank

即使你认为搜索已经摆脱了 PageRank 的影响&#xff0c;但时至今日&#xff0c;PageRank 很可能仍然存在于许多搜索巨头的系统中。 PageRank 曾经是搜索的核心&#xff0c;也是谷歌成为今天这个帝国的基础。 即使你认为搜索已经脱离了 PageRank&#xff0c;但不可否认的是&am…

阶段性复习(三)

if后面是赋值符&#xff0c;所以最后的值是a for&#xff08;&#xff1b; &#xff1b;&#xff09;是死循环 大小写转换 在这道题中&#xff0c;通过分析可知&#xff0c;在小写转换大写的过程中&#xff0c;需要满足的条件是word0&#xff0c;同时是小写&#xff0c;而在第…

Oracle 19c OCP 1z0 082考场真题解析第17题

考试科目&#xff1a;1Z0-082 考试题量&#xff1a;90 通过分数&#xff1a;60% 考试时间&#xff1a;150min 本文为云贝教育郭一军guoyJoe原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 17. Which three …

[C#]opencvsharp进行图像拼接普通拼接stitch算法拼接

介绍&#xff1a; opencvsharp进行图像拼一般有2种方式&#xff1a;一种是传统方法将2个图片上下或者左右拼接&#xff0c;还有一个方法就是融合拼接&#xff0c;stitch拼接就是一种非常好的算法。opencv里面已经有stitch拼接算法因此我们很容易进行拼接。 效果&#xff1a; …

Linux网络编程学习心得.5

1.libevent编写tcp服务器流程 创建套接字 绑定 监听 创建event_base根节点 初始化上树节点 lfd 上树 循环监听 收尾 普通的event事件 文件描述符 事件(底层缓冲区的读事件或者写事件) 触发 回调 高级的event事件 bufferevent事件 核心: 一个文件描述符 两…

【力扣题解】P654-最大二叉树-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P654-最大二叉树-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x1f30f;总结…

【Linux操作系统】探秘Linux奥秘:操作系统的入门与实战

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;诗赋清音&#xff1a;柳垂轻絮拂人衣&#xff0c;心随风舞梦飞。 山川湖海皆可涉&#xff0c;勇者征途逐星辉。 目录 &#x1fa90;1 初识Linux OS …

【BERT】深入BERT模型2——模型中的重点内容,两个任务

前言 BERT出自论文&#xff1a;《BERT&#xff1a;Pre-training of Deep Bidirectional Transformers for Language Understanding》 2019年 近年来&#xff0c;在自然语言处理领域&#xff0c;BERT模型受到了极为广泛的关注&#xff0c;很多模型中都用到了BERT-base或者是BE…

Spring AOP<一>简介与基础使用

spring AOP 基础定义 含义使用切面组织多个Advice,Advice放在切面中定义。也就是说是定义通知的自定义类。自定义的AOP类Aspect连接点方法调用&#xff0c;异常抛出可以增强的点JoinPoint &#xff1a;也就是**被增强的方法的总称&#xff0c;可以获取具体方法的信息&#xff…

结构体:枚举

#include<iostream> using namespace std; int main() {enum weekday { mon, tus, wed, thu, fri, sat,sun }; //声明枚举类型 enum weekday day; //定义枚举变量 int a, b, c, d, e, f, g, loop; //定义整型变量 char ch A; //定义字符变量 f thu; //按照题意&a…

华为服务器安装银河麒麟V10操作系统(IBMC安装)

iBMC是华为面向服务器全生命周期的服务器嵌入式管理系统。提供硬件状态监控、部署、节能、安全等系列管理工具&#xff0c;标准化接口构建服务器管理更加完善的生态系统。 服务器BMC IP&#xff1a;192.168.2.100 一、准备工作 1、确保本机和服务器BMC管理口在同一网络 2、银…