刷题之贪心3

前言

大家好,我是jiantaoyab,这篇文章将给大家介绍贪心算法和贪心算法题目的练习和解析,贪心算法的本质就是每一个阶段都是局部最优,从而实现全局最优。加上这篇文章一共有30道贪心题目了,加油!

坏了的计算器

image-20240323084010973

题目分析

image-20240323090707048

所以,只要tar<= sV,无论是奇数还是偶数都加1,当tar>sV时,奇数+1,偶数/2。

代码

class Solution {
public:int brokenCalc(int startValue, int target) {int count = 0;while(target > startValue){if(target % 2 == 0) target /= 2;else target += 1;count++;}//剩下target <= startValue 都是+1的//所以startValue - target 统计出有多少个1return count + startValue - target;}
};

合并区间

image-20240323091948868

题目分析

这种问题叫区间问题,一般先排序。这里用左端点排序。

image-20240323095428846

证明:能够合并的区间都是连续的

image-20240323100506949

代码

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> ret;//排序sort(intervals.begin(), intervals.end());int left = intervals[0][0], right = intervals[0][1];for(int i = 0; i < intervals.size(); i++){int l = intervals[i][0], r = intervals[i][1];if(l <= right){//有重叠部分right = max(right, r);}else{//没有重叠部分ret.push_back({left, right});left = l;right = r;}}ret.push_back({left, right});return ret;}
};

无重叠区间

image-20240323100619988

贪心的策略如果有重叠区间就移除右断点大的区间,如果没重叠区间的话说明这个区间不会和后面的区间重叠就保留下来,接着用下一个区间去和后面的区间判断。

代码

class Solution {
public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {int count = 0;sort(intervals.begin(), intervals.end());int left = intervals[0][0], right = intervals[0][1];for(int i = 1; i < intervals.size(); i++){int l = intervals[i][0], r = intervals[i][1];if(l < right) {//有重叠部分count++;right = min(right, r);}else  {//没有重叠部分right = r;}}return count;}
};

用最少数量的箭引爆气球

image-20240325084609342

题目分析

这道题目和合并区间求的不一样,我们这里求的是交集。

image-20240325091858577

代码

class Solution {
public:int findMinArrowShots(vector<vector<int>>& points) {sort(points.begin(), points.end());int n = points.size();int ret = 1; //默认是有一个区间去和下一个区间进行比较int right = points[0][1];for(int i = 0; i < n; i++){int l = points[i][0], r = points[i][1];if(l <= right){//有交集right = min(r, right);}else{//没有交集ret++;right = r;}}return ret;}
};

整数替换

image-20240325092631599

题目分析

image-20240325102306024

代码

贪心思想来做

class Solution {
public:int integerReplacement(int n) {int count = 0;while(n != 1){if(n % 2 == 0) {n /= 2;count++;}else{if(n == 3){n = 1;count += 2;}         else if(n % 4 == 3) //说明是...11{n = n / 2 + 1;count += 2;}else //....01{count += 2;n /= 2;}}}return count;}
};

用记忆化搜索做

class Solution {unordered_map<int, int> hash;
public:int dfs(long long n){if(hash[n]) return hash[n];if(n == 1){hash[1] = 0;return 0;} 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];}}int integerReplacement(int n) {return dfs(n);}
};

俄罗斯套娃信封问题

image-20240325103044807

题目分析

image-20240325110947735

代码

不是很理解的可以看看第一篇贪心算法

class Solution {
public:int maxEnvelopes(vector<vector<int>>& envelopes) {sort(envelopes.begin(), envelopes.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(envelopes[0][1]);for(int i = 1; i < envelopes.size(); i++){int r = envelopes[i][1];if(r > ret.back()){ret.push_back(r);}else{int left = 0, right = ret.size() - 1;while(left < right){int mid = (left + right) / 2;if(ret[mid] >= r) right = mid;else left = mid + 1;}ret[left] = r;}}return ret.size();}
};

可被三整除的最大和

image-20240326191035787

题目分析

image-20240326193532737

引入一个新问题,如何求出最小值和次小值

image-20240326193915292

代码

class Solution {
public:int maxSumDivThree(vector<int>& nums) {const int INF = 0x3f3f3f3f;int x1 = INF, x2 = INF, y1 = INF, y2 = INF;int 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);}
};

距离相等的条形码

image-20240326195602785

题目分析

把数字间隔1个数字放,先放次数最多的,放下的数字的顺序怎么放都可以。

证明

题目一定是有解的,那么出现最多的那个数字不能超过 n + 1 / 2次,因为如果有n个抽屉,放n + 1 个东西,必然有一个抽屉放2个,分情况讨论。

如果最多出现的数字次数刚好是 n + 1 / 2,那么剩下的随便放,都不相邻

如果出现的数字次数小于 n + 1 / 2,那更不可能相邻了,如果有相邻的说明这个数字出现的次数一定比 这个数字出现的次数多,那它就是最多出现次数的数字了,所以先放次数最多的,放下的数字的顺序怎么放都可以。

代码

class Solution {
public:vector<int> rearrangeBarcodes(vector<int>& barcodes) {unordered_map<int, int> hash;int n = barcodes.size();int max_val = 0, max_count = 0;for(auto x : barcodes){if(max_count < ++hash[x]){max_val = x;max_count = hash[x];}}vector<int> ret(n);int index = 0;//先放出现次数最多的数字for(int i = 0; i < max_count; i++){ret[index] = max_val;index += 2;}//处理剩下的数字hash.erase(max_val);for(auto& [x, y] : hash){for(int i = 0; i < y; i++){if(index >= n)index = 1;ret[index] = x;index += 2;}}return ret;}
};

重构字符串

image-20240326203040064

代码

这道题目和上一题的区别就是这道题目可能是没有解的。

class Solution {
public:string reorganizeString(string s) {int hash[26] = {0};int n = s.size();char max_ch = ' ';int max_count = 0;for(const auto ch : s){if(max_count < ++hash[ch - 'a']){max_count = hash[ch - 'a'];max_ch = ch;}}if(max_count > (n + 1) / 2 ) return "";string ret(n, ' ');int index = 0;//先放最多的英文for(int i = 0; i < max_count; i++){ret[index] = max_ch;index += 2;}hash[max_ch - 'a'] = 0;//放剩下的英文for(int i = 0; i < 26; i++){for(int j = 0; j < hash[i]; j++){if(index >= n) index = 1;ret[index] = 'a' + i;index += 2;}}return ret;}
};

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

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

相关文章

【学习】软件测试行业有哪些从业方向

从事任何一个行业&#xff0c;不论想入行的新人还是已经在职的从业人员&#xff0c;一定要系统化的掌握自身的学习路线和发展方向&#xff0c;随时对自身的优劣点掌握清楚。尤其是对于软件测试这个岗位。测试职业所涉及的技能范围比较广&#xff0c;测试流程、测试计划、缺陷管…

考研数学|《1800》《1000》《880》《660》最佳搭配使用方法

直接说结论&#xff1a;基础不好先做1800、强化之前660&#xff0c;强化可选880/1000题。 首先&#xff0c;传统习题册存在的一个问题是题量较大&#xff0c;但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大&#xff0c;但有些题目难度不够平衡&#xff0c;有些过于简单…

前端 使用递归函数优化循环请求过程

目录 背景&#xff1a; 简介&#xff1a; 举个栗子&#x1f330;&#xff1a; 这是我们的原始代码&#xff1a; 这是改造后的代码&#xff1a; 总结一下&#xff1a; 背景&#xff1a; 在软件开发中&#xff0c;经常会遇到需要进行多次循环请求的情况。然而&#xff0c;…

财务收支系统怎么做,财务收支记账软件管理系统教程

财务收支系统怎么做&#xff0c;财务收支记账软件管理系统教程 一、前言 以下软件操作教程以 佳易王财务收支记账软件V17.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 财务收支记账管理系统软件可按需定制 1、权限设置&#xff1a;管理员账…

【Java程序设计】【C00345】基于Springboot的船舶监造管理系统(有论文)

基于Springboot的船舶监造管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及i…

第四届数字信号与计算机通信国际学术会议(DSCC 2024)

#高录用&#xff0c;稳检索# #高校背书&#xff0c;更可靠# DSCC 2024已通过SPIE出版社审核&#xff0c;ISSN号已确定&#xff1a;ISSN: 0277-786X&#xff0c;往届均已见刊EI检索&#xff01; 第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 …

Linux服务器mamba环境配置

# windows目前装不了 目录 安装步骤&#xff1a; 可能出现的问题&#xff1a; 安装步骤&#xff1a; 需要的配置&#xff1a; CUDA(11.6) pytorch (1.12) 先装好和CUDA版本对应的torch&#xff01;&#xff01;不然后面问题一堆 packaging triton 官方readme.md文件要…

智慧校园数据可视化有什么好处?怎么推进数字化校园方案?

在当今数字化时代&#xff0c;越来越多学校开始实施智慧校园计划&#xff0c;旨在为学生和教师提供更高效、便捷的学习和教学环境。智慧校园运用互联网、大数据、人工智能等技术&#xff0c;对校园内各信息进行收集、整合、分析和应用&#xff0c;实现教学、管理、服务等多方面…

华为openGauss数据库命令大全:一站式掌握核心运维操作

引言&#xff1a; 华为openGauss作为一款高性能、安全可控的企业级数据库产品&#xff0c;其强大功能离不开一套完善且高效的命令行工具。本文将为您详细介绍openGauss数据库的常用命令&#xff0c;帮助您快速掌握数据库的日常运维操作。 一、服务管理命令 启动数据库服务 gs…

链表题牛客

链表反转 ListNode* ReverseList(ListNode* head){ListNode* a NULL;ListNode* b head;while(b!NULL){ListNode* cb->next;b->nexta;ab;bc;}return a; }链表内指定区间反转 ListNode* reverseBetween(ListNode* head, int m, int n) {ListNode* res new ListNode(-1…

python和Vue开发的RBAC用户角色权限管理系统

后端框架&#xff1a;python的FastAPI作为后端服务和python-jose作为JWT认证 前端框架&#xff1a;Vue3构建页面和Vue Router作为路由管理&#xff0c;Pinia作为数据存储&#xff0c;Vite作为打包工具 可以实现菜单控制和路由控制&#xff0c;页面里面有按钮权限控制&#xf…

【R包开发:包的组件】 第4章 包的元数据

DESCRIPTION(描述文件) 的作用是存储包中重要的元数据。当第一次开发包时, 你会 使用这个文件记录包运行时所需要的包。然而,随着时间的流逝,当开始与他人分享包 时,元数据文件变得越来越重要,因为它指定了谁可以使用它(许可证),以及如果包有 什么问题时需要和谁(你!)联系…

客户端测试 可测性改进-学习记录

客户端测试面临的挑战 难点&#xff1a; 业务复杂&#xff0c;产品多&#xff0c;技术栈多样 测试过程的痛点&#xff1a; 配置-》执行-〉检查-》结果 手工测试前置配置操作极其繁琐&#xff1a;安装测试包-〉进入debug页面-》设置h-〉设置AB test-》锁定rn包-〉进入业务页…

java解决跨域问题

浏览器js在访问服务器中的资源时&#xff0c;会出现同一页面或者不同域名(协议&#xff0c;IP&#xff0c;端口)不可访问 例如:file://d://test.html页面(file协议)中通过ajax访问服务器api.test.com的接口(http协议)&#xff0c;由于协议不同&#xff0c;此时会出现浏览器访问…

CVE-2020-15778 OpenSSH命令注入漏洞

预备知识 漏洞描述 OpenSSH8.3p1及之前版本中scp的scp.c文件存在操作系统命令注入漏洞。该漏洞即使在禁用ssh登录的情况下,但是允许使用scp传文件,而且远程服务器允许使用反引号(`)。攻击者可利用scp复制文件到远程服务器时,执行带有payload的scp命令,从而在后续利用中ge…

相对全面的四足机器人驱动规划MATLAB和Simulink实现方式(足端摆线规划,Hopf-CPG,Kimura-CPG)

许久没更新四足机器人相关的博客文章&#xff0c;由于去年一整年都在干各种各样的~活&#xff0c;终于把硕士毕业论文给写好&#xff0c;才有点时间更新自己的所学和感悟。步态规划和足端规划只是为了在运动学层面获取四足机器人各关节的期望角位移和速度信号&#xff0c;再由底…

Glide报错:FileNotFoundException: XX open failed: EACCES (Permission denied)

问题描述&#xff1a; targetVersion:33&#xff0c;Manifest已经申请了READ_MEDIA_IMAGES&#xff0c;WRITE_EXTERNA权限&#xff0c;代码里也动态申请了权限。但是通过系统相册选择图片后&#xff0c;将uri转为path之后&#xff0c;用glide加载path一直报这个错误。如果用gl…

JavaScript语法和数据类型

基础 JavaScript 借鉴了 Java 的大部分语法&#xff0c;但同时也受到 Awk、Perl 和 Python 的影响。 JavaScript 是区分大小写的&#xff0c;并使用 Unicode 字符集。举个例子&#xff0c;可以将单词 Frh&#xff08;在德语中意思是“早”&#xff09;用作变量名。 var Frh …

Nacos部署(二)Linux部署Nacos2.3.x集群环境

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Nacos部署&#xff08;二&#xff09;Linux部署Nacos2.3.x集群环境 ⏱️…

Xshell连接虚拟机非常慢

问题&#xff1a; 打开虚拟机连接时发现过了几分钟依然卡着在&#xff0c;但是主机可以ping通虚拟机&#xff0c;虚拟机也可以ping通主机感觉很奇怪&#xff0c;查询后得知需要修改ssh设置 打开配置 vim /etc/ssh/sshd_config 修改配置 找到 UseDNS&#xff0c;去掉前面的#号…