【贪心算法】(第十四篇)

目录

可被三整除的最⼤和(medium)

题目解析

讲解算法原理

编写代码

距离相等的条形码(medium)

题目解析

讲解算法原理

编写代码


可被三整除的最⼤和(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个整数数组 nums ,请你找出并返回能被三整除的元素最⼤和。
⽰例1:
输⼊:nums=[3,6,5,1,8]
输出:18
解释:选出数字3,6,1和8,它们的和是18(可被3整除的最⼤和)。⽰例2:
输⼊:nums=[4]
输出:0
解释:4不能被3整除,所以⽆法选出数字,返回0。⽰例3:
输⼊:nums=[1,2,3,4,4]
输出:12
解释:选出数字1,3,4以及4,它们的和是12(可被3整除的最⼤和)。
提⽰:
◦ 1 <= nums.length <= 4 * 10^4
◦ 1 <= nums[i] <= 10^4

讲解算法原理

解法(正难则反+贪⼼+分类讨论):
正难则反:

我们可以先把所有的数累加在⼀起,然后根据累加和的结果,贪⼼的删除⼀些数。
分类讨论:
设累加和为 sum ,⽤ x 标记 %3 == 1 的数,⽤ y 标记 % 3 == 2 的数。那么根据 sum 的余数,可以分为下⾯三种情况:
a. sum % 3 == 0 ,此时所有元素的和就是满⾜要求的,那么我们⼀个也不⽤删除;b. sum % 3 == 1 ,此时数组中要么存在⼀个 x ,要么存在两个 y 。因为我们要的是最⼤
值,所以应该选择 x 中最⼩的那么数,记为 x1 ,或者是 y 中最⼩以及次⼩的两个数,记为 y1, y2 。
那么,我们应该选择两种情况下的最⼤值: max(sum - x1, sum - y1 - y2) ;c. sum % 3 == 2 ,此时数组中要么存在⼀个 y ,要么存在两个 x 。因为我们要的是最⼤
值,所以应该选择 y 中最⼩的那么数,记为 y1 ,或者是 x 中最⼩以及次⼩的两个数,记为 x1, x2 。
那么,我们应该选择两种情况下的最⼤值: max(sum - y1, sum - x1 - x2) ;

编写代码

c++算法代码:

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

java算法代码:

class Solution
{
 public int maxSumDivThree(int[] nums) 
 {
 int INF = 0x3f3f3f3f;
 int sum = 0, x1 = INF, x2 = INF, y1 = INF, y2 = INF;
 for(int 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 Math.max(sum - x1, sum - y1 - y2);
 else return Math.max(sum - y1, sum - x1 - x2);
 }
}

距离相等的条形码(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

在⼀个仓库⾥,有⼀排条形码,其中第 i 个条形码为 barcodes[i] 。
请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。你可以返回任何满⾜该要求的答案,此题保证存在答案。
⽰例1:
输⼊:barcodes=[1,1,1,2,2,2]
输出:[2,1,2,1,2,1]
⽰例2:
输⼊:barcodes=[1,1,1,1,2,2,3,3]
输出:[1,3,1,3,2,1,2,1]
提⽰:
◦ 1 <= barcodes.length <= 10000
◦ 1 <= barcodes[i] <= 10000

讲解算法原理

解法(贪⼼):
贪⼼策略:

每次处理⼀批相同的数字,往n个空⾥⾯摆放;
每次摆放的时候,隔⼀个格⼦摆放⼀个数;
优先处理出现次数最多的那个数。

编写代码

c++算法代码:

class Solution
{
public:
 vector<int> rearrangeBarcodes(vector<int>& b) 
 {
 unordered_map<int, int> hash; // 统计每个数出现的频次 int maxVal = 0, maxCount = 0; 
 for(auto x : b)
 {
 if(maxCount < ++hash[x])
 {
 maxCount = hash[x];
 maxVal = x;
 }
 }
 int n = b.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) index = 1;
 ret[index] = x;
 index += 2;
 }
 }
 return ret;
 }
};

java算法代码:

class Solution
{
 public int[] rearrangeBarcodes(int[] b) 
 {
 Map<Integer, Integer> hash = new HashMap<>(); // 统计每个数出现了多少次 int maxVal = 0, maxCount = 0;
 for(int x : b)
 {
 hash.put(x, hash.getOrDefault(x, 0) + 1);
 if(maxCount < hash.get(x))
 {
 maxVal = x;
 maxCount = hash.get(x);
 }
 }
 int n = b.length;
 int[] ret = new int[n];
 int index = 0;
 // 先处理出现次数最多的那个数
 for(int i = 0; i < maxCount; i++)
 {
 ret[index] = maxVal;
 index += 2;
 }
 hash.remove(maxVal);
 for(int x : hash.keySet())
 {
 for(int i = 0; i < hash.get(x); i++)
 {
 if(index >= n) index = 1;
 ret[index] = x;
 index += 2;
 }
 }
 return ret;
 }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

洞见数据未来,StarRocks Summit Asia 2024 即将启幕!

在 AI 时代&#xff0c;我们需要怎样的数据基础软件&#xff1f; 数据量和数据类型的需求飞速上涨&#xff0c;我们不仅需要将历史上各种基础设施中的数据进行分析使用&#xff0c;还要关注性能、灵活性、性价比&#xff0c;以及确保单一可信数据源。这一切构成了当前大数据领…

三维管线管网建模工具MagicPipe3D V3.5.3

经纬管网建模系统MagicPipe3D&#xff0c;本地离线参数化构建地下管网三维模型&#xff08;包括管道、接头、附属设施等&#xff09;&#xff0c;输出标准3DTiles、Obj模型等格式&#xff0c;支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析&…

喜报!腾讯云存储获第三届“鼎新杯”优秀案例!

引言 2024年9月24日-25日&#xff0c;由中国通信标准化协会主办、中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;承办、中国通信企业协会支持的“2024数字化转型发展大会”在北京召开。大会公布了第三届“鼎新杯”数字化转型应用大赛案例评选结果。 腾讯云存…

预算不够,怎么跟KOL砍价?(内附砍价模板)

​在当今的数字营销时代&#xff0c;海外红人&#xff08;KOL&#xff09;的影响力不容小觑。他们的一篇帖子、一个视频&#xff0c;甚至是一张照片&#xff0c;都有可能为企业带来巨大的流量和销量。 当企业满怀希望地找到一位粉丝众多、影响力强的KOL&#xff0c;准备洽谈合作…

2024年双十一有什么必买好物推荐?双11最值得关注的宝藏好物分享

​随着2024年双十一购物狂欢节的到来&#xff0c;各种实用且富有创意的小物件成为了大家关注的焦点。在这场全民参与的购物盛宴中&#xff0c;一款既能满足日常需求又能提升生活便捷性的宝藏好物——充电宝&#xff0c;成为了许多人心目中的首选。无论是忙碌的上班族&#xff0…

【前端Vue学习笔记】组件注册方式 组件传递数据 组件事件 透传 插槽slot 组件生命周期 动态组件 异步组件 依赖注入 Vue应用

文章目录 组件注册方式全局注册全局注册的缺点推荐使用局部注册步骤 组件传递数据-Props步骤注意事项 组件传递多种数据类型组件传递Props效验默认值必选项注意警告 组件事件父组件代码子组件代码 组件之间传递数据的方案父传子子传父 组件事件配合v-model使用步骤&#xff1a;…

linux网络编程5——Posix API和网络协议栈,使用TCP实现P2P通信

文章目录 Posix API和网络协议栈&#xff0c;使用TCP实现P2P通信1. socket()2. bind()3. listen()4. connect()5. accept()6. read()/write(), recv()/send()7. 内核tcp数据传输7.1 TCP流量控制7.2 TCP拥塞控制——慢启动/拥塞避免/快速恢复/快速重传 8. shutdown()9. close()9…

【线下培训】龙信科技应邀参与了由教育部网络安全与执法虚拟教研室(中国刑事警察学院)举办的学术讲座

文章关键词&#xff1a;电子数据取证培训、产学研推进、手机取证、介质取证 2024年10月23日&#xff0c;龙信科技应邀参与了由教育部网络安全与执法虚拟教研室&#xff08;中国刑事警察学院&#xff09;举办的学术讲座。在这次学术交流中&#xff0c;我们公司的技术专家陈杰以…

Redis Search系列 - 第一讲 创建索引

目录 一、引言二、全文检索基本概念三、创建索引 一、引言 Redis Search 是 Redis 的一个模块&#xff0c;用于提供全文搜索和二级索引功能。它允许在 Redis 数据库中执行复杂的搜索查询&#xff0c;并支持多种数据类型和查询操作。以下是 Redis Search 的一些关键特性&#x…

学习threejs,使用canvas样式化粒子

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.PointCloud简介1.11 …

Vue3+ts+vite自动导入vue的依赖

Vue3tsvite自动导入vue的依赖 unplugin-auto-import 主要依赖 npm i -D unplugin-auto-import// vite.config.ts import AutoImport from unplugin-auto-import/viteexport default defineConfig({plugins: [AutoImport({ imports: ["vue", "vue-router"…

团体标准审查结果一般会有哪几种情况?

1. 通过&#xff1a; • 标准质量高&#xff1a;标准的内容符合国家法律法规和相关标准的要求&#xff0c;技术指标科学、合理、先进&#xff0c;具有较强的适用性和可操作性 • 材料完整规范&#xff1a;送审材料齐全&#xff0c;标准的格式、文本编写等符合规定&#xff0c;为…

深入拆解TomcatJetty——Tomcat生命周期与多层容器

深入拆解Tomcat&Jetty&#xff08;三&#xff09; 专栏地址&#xff1a;https://time.geekbang.org/column/intro/100027701 1 Tomcat组件生命周期 Tomcat如何如何实现一键式启停 Tomcat 架构图和请求处理流程如图所示&#xff1a; 对组件之间的关系进行分析&#xff0c;…

deploylinux的ubuntu系统无法成功安装使用MySQL❓

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

如何编辑加密的PDF文件?

PDF文件打开之后&#xff0c;发现编辑功能都是灰色的&#xff0c;无法使用&#xff0c;无法编辑PDF文件&#xff0c;遇到这种情况&#xff0c;是因为PDF文件设置了限制编辑导致的。一般情况下&#xff0c;我们只需要输入PDF密码&#xff0c;将限制编辑取消就可以正常编辑文件了…

由于导出的数据名字中带有/,导致Matlab打不开,怎么办?

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

Spring Boot集成PageHelper分页插件详解---补充

这里写目录标题 内容补充 内容 ⭐最新版!SpringBoot正确集成PageHelper姿势&#xff0c;不再被误导&#xff01; Spring Boot集成PageHelper分页插件详解 原本看了这两篇文章&#xff0c;觉得写的其实挺好的。但是发现两篇文章里面&#xff0c;对于方法的使用&#xff0c;都…

昆虫种类识别数据集昆虫物种分类数据集YOLO格式VOC格式 目标检测 机器视觉数据集

一、数据集概述 数据集名称&#xff1a;10类昆虫图像数据集 数据集包含了多种农作物中常见的昆虫种类&#xff0c;包括军虫、豆蓟象、红蜘蛛、水稻瘿蚊、水稻卷叶蛾、水稻叶蝉、水稻水蚤、小麦薄翅薄翅蔗蝇、白背飞虱和黄稻螟。 1.1可能应用的领域 农业害虫监测与防控&#x…

C++,STL 044(24.10.24)

内容 1.set容器的构造函数。 2.set容器的赋值操作。 运行代码 #include <iostream> #include <set>using namespace std;void printSet(set<int> &s) {for (set<int>::iterator it s.begin(); it ! s.end(); it){cout << *it << &…

好书推荐|《Python最优化算法实战》

简介 本书以理论结合编程开发为原则&#xff0c;使用Python作为开发语言&#xff0c;讲解优化算法的原理和应用&#xff0c;详细介绍了Python基础、Gurobi 优化器、线性规划、整数规划、多目标优化、动态规划、图与网络分析、智能优化算法。对于算法部分的每一种算法都包含原理…