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://www.hqwc.cn/news/309341.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【并发】AtomicInteger很安全

AtomicInteger 简介与常规用法 AtomicInteger 是 Java 中 java.util.concurrent.atomic 包下的一个类。用于实现原子操作的整数。它是一个基于CAS&#xff08;Compare-And-Swap&#xff09;实现的原子整数类。它提供了一系列的原子操作&#xff0c;确保对整数的操作是原子性的&…

C#高级 08Json操作

1.概念 Json是存储和交换文本信息的语法。类似于XML。Json比XML更小、更快、更易解析。Json与XML一样是一种数据格式。Json是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。Json采取完全独立于语言的文本格式&#xff0c; 但是也使用了类似于C语言的习惯。这些特性使…

DevEco Studio4.0 Beta2集成ArkUI-X(开发鸿蒙,安卓.ios应用)/ACE Tools脚手架

ArkUI-X简介 ArkUI-X进一步将ArkUI扩展到了多个OS平台&#xff1a;目前支持OpenHarmony、HarmonyOS、Android、 iOS&#xff0c;后续会逐步增加更多平台支持。开发者基于一套主代码&#xff0c;就可以构建支持多平台的精美、高性能应用 该框架对应的IDE版本为 4.0 Beta2 &…

【数据结构复习之路】查找(严蔚敏版)万字详解

专栏&#xff1a;数据结构复习之路 复习完上面四章【线性表】【栈和队列】【串】【数组和广义表】【树和二叉树】【图】&#xff0c;我们接着复习 查找&#xff0c;这篇文章我写的非常详细且通俗易懂&#xff0c;看完保证会带给你不一样的收获。如果对你有帮助&#xff0c;看在…

Spring-5-切入点的高级使用

Spring提供了两个额外的Pointcut实现&#xff0c;分别是ComposablePointcut和ControlFlowPointcut,它们提供了所需的灵活性。 使用控制流切入点 由ControlFlowPointcut类实现的Spring控制流切入点类似于许多其他AOP实现中可用的cflow构造&#xff0c;尽管功能上没有那么强大。…

集群部署篇--Redis 集群分片模式

文章目录 前言一、Redis 分片集群介绍1.1 介绍&#xff1a;1.2 工作机制&#xff1a;1.2.1 节点&#xff1a;1.2.2 槽 slot&#xff1a;1.2.3 故障转移&#xff1a; 二、Redis 分片集群搭建:2.1 配置文件&#xff1a;2.2 redis 部署&#xff1a;2.3 redis 集群创建&#xff1a;…

大数据背后的绿色收割:基于Hadoop的农产品价格信息智能分析

大数据背后的绿色收割&#xff1a;基于Hadoop的农产品价格信息智能分析 引言正文1. 数据获取与准备2. 数据清洗与处理3. Hadoop数据分析引擎的运用4. MySQL数据库的集成5. 创新性的可视化6. 结论与展望 结语 引言 随着信息技术的不断发展&#xff0c;农业领域也在数字化的浪潮…

padStart(),padEnd()

今天获取当前时间的时候&#xff0c;gpt输出这样的代码&#xff0c;padStart(2, 0) function getCurrentDateFormatted() {const currentDate new Date();const month (currentDate.getMonth() 1).toString().padStart(2, 0);const day currentDate.getDate().toString().…

10.定时器各功能分析及编码

知识汇总&#xff1a; STM32的定时器有三种&#xff0c;高级定时器&#xff0c;通用定时器&#xff0c;基本定时器 就是功能多与少的差别&#xff0c;下面来逐个解释功能&#xff1a;在此之前&#xff0c;需要对几个概念有认知 几个概念&#xff1a; 1.定时器时钟频率&…

MySQL:索引

MySQL官方对索引的定义为: 索引 (Index) 是帮助MySQL高效获取数据的数据结构。 提取句子主干&#xff0c;就可以得到索引的本质:索引是数据结构。 1. 什么是索引&#xff0c;索引的作用 索引是一种用于快速查询和检索数据的数据结构&#xff0c;帮助mysql提高查询效率的数据…

【项目管理】CMMI-项目总体计划模版

目录 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章 运维计划 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章运维计划

汽配订货系统 助力汽配行业数字化转型升级

一个汽配订货系统可以助力汽配行业数字化转型升级&#xff0c;提供以下功能和优势&#xff1a; 1. 订单管理&#xff1a;订货系统可以记录每笔订单的详细信息&#xff0c;包括客户信息、产品信息、价格、数量等&#xff0c;方便汽配商进行订单统计和分析。 2. 库存管理&#x…