leetcode贪心算法题总结(三)

本章目录

  • 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://xiahunao.cn/news/2662259.html

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

相关文章

【网络安全 | XCTF】simple_transfer

考察kali基本工具的使用 方法一 打开文件如图&#xff1a; 存在较多协议&#xff0c;将协议分级&#xff1a; 可以看到DLEP协议占比最大&#xff1a; 将其作为过滤器应用&#xff1a; 搜索DLEP&#xff1a; 并没有有利信息&#xff0c;但观察到多数数据包损坏&#xff1a; 执行…

Flutter BottomSheet 拖动分两段展示

第一段 第二段 实现思路 通过 GestureDetector 的 Drag 方法&#xff0c;动态改变Dialog的高度&#xff0c;通过设置一个最大高度和最小高度分成两层进行展示 实现 常用的展示BottomSheet的方法为 showModalBottomSheet /// 设置最高最好以高度的比例进行设置&#xff0c;方…

【高性能篇】QPS概念、RT概念

什么是QPS&#xff0c;什么是RT&#xff1f; ✔️典型解析✔️扩展知识仓✔️RT ✔️QPS✔️ QPS和TPS✔️并发用户数✔️最佳线程数 ✔️典型解析 QPS&#xff0c;指的是系统每秒能处理的请求数(Query Per Second)&#xff0c;在Web应用中我们更关注的是Web应用每秒能处理的re…

软件测试/测试开发丨Selenium环境安装配置

一、selenium 环境配置 1、下载浏览器 目前比较常用的浏览器是 Google Chrome 浏览器&#xff0c;所以本教程以 chrome 为主&#xff0c;后面简介一下其他浏览器的环境配置。 chrome 下载: www.google.cn/chrome/ 2、chromedriver 环境配置 chromedriver 是chromedriver提…

【neo4j】desktop下载

【neo4j】desktop下载 https://neo4j.com/download/ 点击download&#xff0c;填写表格 之后就可以正常使用了

本地搭建微信小程序或者公众号开发服务器的简单方法

现在小程序开发需要购买服务器&#xff0c;价格还是有点贵的&#xff0c;这里好代码网分享一个可以花费小代价就可以搭建一个本地服务器&#xff0c;可以用来开发小程序和微信公众号等。 1.域名&#xff08;备案过的&#xff09; 2.阿里云注册免费的https证书 3.配置本地的ngi…

玩转区域流量调配,详细解析GLSB是什么?

在互联网早期&#xff0c;由于网络不是很发达&#xff0c;流量也相对比较小&#xff0c;单体架构已经能足够满足需求。但伴随着互联网越来越&#xff0c;网站的流量请求甚至能达到上千亿。为了实现高可用&#xff0c;需要用到多台机器来提升处理流量的能力。在这种环境下&#…

C++文件操作-文本文件-读文件

示例&#xff1a; #include<iostream> using namespace std; #include<fstream> #include<string> void test01() {//创建文件流ifstream ifs;//打开文件 并判断文件是否打开成功ifs.open("test.txt", ios::in);if (!ifs.is_open()){cout <<…

企业品牌推广在国外媒体投放的意义和作用何在?

海外广告投放是企业在国际市场推广的重要战略&#xff0c;具有多种形式&#xff0c;包括社交媒体广告、短视频广告、电视广告等。这些广告形式在传播信息、推动销售、塑造品牌形象等方面发挥着独特的作用。 其中软文发稿是一种注重叙事和信息传递的广告形式&#xff0c;对于企…

探秘交互设计:深入了解五大核心维度!

交互式设计是用户体验&#xff08;UX&#xff09;设计的重要组成部分。本文将解释什么是交互设计&#xff0c;并分享一些有用的交互设计模型&#xff0c;并简要描述交互设计师通常做什么。 如何解释交互设计 交互式设计可以用一个简单的术语来理解&#xff1a;它是用户和产品…

使用yolov5的2.0分支训练自己的模型并在x3派运行

目录 准备代码、权重、数据集配置环境准备数据标注数据 训练模型转换模型验证模型准备校准数据转换为板上模型模型精度分析 上板 之前训练自己模型的时候使用的是博主 bubbling的1.0分支的代码&#xff0c;博主的 博客比较详细&#xff0c;使用的是VOC2007数据集&#xff0c;…

新能源汽车制造设备状态监测:无线温振传感器的应用

随着全球对环境保护的关注度不断增加&#xff0c;新能源汽车的市场需求正在逐步扩大。而为了满足这一需求&#xff0c;新能源汽车制造企业必须依赖高效、可靠的设备来进行生产制造。然而&#xff0c;设备状态的监测与维护对于保证生产线的稳定运行至关重要。无线温振传感器作为…

win10 telnet服务开启教程

win10 telnet服务开启教程 1、打开控制面板&#xff0c;选择【程序和功能】 2、点击【启用或关闭Windows功能】 3、勾选【Telnet 客户端】,然后点击确定。

英语中修饰头发的形容词顺序是怎么样的(加补充)

一、英语描述发型 :漂亮长短形状颜色头发。 例如她有一头美丽的黑色的直发。She has beautiful long straight black hair.二、多个形容词修饰同一名词时的顺序是固定的&#xff0c;其顺序为&#xff1a;①冠词、指示代词、不定代词、物主代词②序数词基数词③一般性描绘形容词…

MR实战:分科汇总求月考平均分

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建学生实体类5、创建科目平均分映射器类…

分享一个qml开发的Dialog

一、效果预览 二、源码分享 PopwindowWidget.qml import QtQuick import QtQuick.Controls import QtQuick.LayoutsApplicationWindow {id:selfwidth: 470height: 250visible: falsecolor: "#00000000"flags: Qt.Tool | Qt.FramelessWindowHint|Qt.MSWindowsFixedSiz…

阿里云数据库polardb怎么收费?

阿里云数据库PolarDB租用价格表&#xff0c;云数据库PolarDB MySQL版2核4GB&#xff08;通用&#xff09;、2个节点、60 GB存储空间55元5天&#xff0c;云数据库 PolarDB 分布式版标准版2核16G&#xff08;通用&#xff09;57.6元3天&#xff0c;阿里云百科aliyunbaike.com分享…

PPT可以转换成电子画册吗

答案是当然可以&#xff0c;PPT是可以转换成电子画册的。电子画册具有3D仿真翻页的效果&#xff0c;而且还可以很好地保存图片和文字信息&#xff0c;并方便在各种设备上查看。 要将PPT转换成电子画册&#xff0c;只需要一个工具就能轻松转换。给大家推荐这款转换工具&#xff…

Linux开发工具——gdb篇

Linux下调试工具——gdb 文章目录 makefile自动化构建工具 gdb背景 gdb的使用 常用命令 总结 前言&#xff1a; 编写代码我们使用vim&#xff0c;编译代码我们使用gcc/g&#xff0c;但是我们&#xff0c;不能保证代码没问题&#xff0c;所以调试是必不可少的。与gcc/vim一样&…

华为发布《智能世界2030》思维导图笔记

华为发布《智能世界2030》思维导图笔记