每日一练:LeeCode-561、 数组拆分【数组+排序】

给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1nmin(ai, bi) 总和最大。

返回该 最大总和

示例 1:

输入:nums = [1,4,3,2]
输出:4
解释:所有可能的分法(忽略元素顺序)为:
1. (1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
2. (1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
3. (1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4
所以最大总和为 4

示例 2:

输入:nums = [6,2,6,5,1,2]
输出:9
解释:最优的分法为 (2, 1), (2, 5), (6, 6). min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9

提示:

  • 1 <= n <= 10^4
  • nums.length == 2 * n
  • -10^4 <= nums[i] <= 10^4

思路

希尔排序

class Solution {public int arrayPairSum(int[] nums) {nums = ShellSort(nums); // 对输入数组进行希尔排序,使得数组中的元素按照从小到大的顺序排列int res = 0; // 初始化最终结果为0for(int i = 0; i < nums.length; i++){ // 遍历排序后的数组res += nums[i]; // 将数组中的每个元素依次加到结果中i++; // 跳过下一个元素,因为数组已经排序,所以取每个配对的第一个元素即可}return res; // 返回最终结果}public int[] ShellSort(int[] array) {int len = array.length; // 获取数组的长度int temp, gap = len / 2; // 初始化临时变量和希尔增量为数组长度的一半while (gap > 0) { // 当希尔增量大于0时,执行循环for (int i = gap; i < len; i++) { // 对数组中每个元素进行希尔增量排序temp = array[i]; // 将当前元素暂存到临时变量中int preIndex = i - gap; // 计算当前元素的前一个希尔增量的索引// 对当前分组中的元素进行插入排序while (preIndex >= 0 && array[preIndex] > temp) { // 当前元素小于前一个元素时,进行插入排序array[preIndex + gap] = array[preIndex]; // 将前一个元素移到当前位置preIndex -= gap; // 更新前一个元素的索引}array[preIndex + gap] = temp; // 将当前元素插入到正确的位置}gap /= 2; // 缩小希尔增量,直到增量为1时,整个数组被排序}return array; // 返回排序后的数组}
}
  • 首先调用 ShellSort(nums) 方法对输入数组进行希尔排序,使得数组中的元素按照从小到大的顺序排列。
  • 然后初始化最终结果 res 为0。
  • 通过一个 for 循环遍历排序后的数组,每次取两个元素中较小的那个,将其加到结果 res 中。因为数组已经排序,所以取每个配对的第一个元素即可,所以 i++ 用于跳过下一个元素。
  • 最后返回最终结果 res
  • ShellSort(int[] array) 方法实现了希尔排序算法,用于对输入数组进行排序。
  • 首先获取数组的长度,并初始化临时变量 temp 和希尔增量 gap 为数组长度的一半。
  • 通过一个 while 循环,对数组中的每个元素进行希尔增量排序。
  • 在循环中,首先将当前元素暂存到临时变量中,然后计算当前元素的前一个希尔增量的索引,并对当前分组中的元素进行插入排序。
  • 在插入排序中,当当前元素小于前一个元素时,将前一个元素移到当前位置,然后更新前一个元素的索引。
  • 最后返回排序后的数组。

Arrays.sort()

class Solution {public int arrayPairSum(int[] nums) {Arrays.sort(nums);int res = 0;for(int i=0;i<nums.length;i++){res+=nums[i];i++;}return res;}
}

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

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

相关文章

codeTop:二叉树最大深度

属于二叉树遍历的变形&#xff0c;这里使用DFS的递归方式 最大深度就是 max(左子树最大深度 ,右子树最大深度) 1&#xff0c; 而计算左/右子树最大深度可以用相同的算法。 public int maxDepth(TreeNode root) { if(root null){return 0; } int lh maxDepth(root.left); in…

ConcurrentHashMap 为什么是线程安全的?

1、典型回答 ConcurrentHashMap 在不同JDK 版本中&#xff0c;保证线程安全的手段是不同的&#xff0c;它主要分为以下两种情况&#xff1a; JDK 1.7 之前(包含JDK 1.7)&#xff0c;ConcurrentHashMap 主要是通过分段锁 (Segment Lock) 来保证线程安全的。而在JDK 1.8 之后(包…

【数据结构和算法初阶(C语言)】二叉树的链式结构--前、中、后序遍历实现详解,节点数目计算及oj题目详解---二叉树学习日记③

1.二叉树的链式存储 二叉树的链式存储结构是指&#xff0c;用链表来表示一棵二叉树&#xff0c;即用链来指示元素的逻辑关系。 通常的方法是 链表中每个结点由三个域组成&#xff0c;数据域和左右指针域&#xff0c;左右指针分别用来给出该结点左孩子和右孩子所 在的链结点的存…

Qt——2D画图

基础画图函数 矩形 painter.drawRect(50,50,200,100); 圆角矩形 painter.drawRoundRect(50,50,200,200,50,50); xRadius和yRadius分别以矩形宽度和高度的一半的百分比指定&#xff0c;并且应该在0.0到100.0的范围内 弧线 painter.drawArc(50,50,200,200, -90*16, 90*16);…

web渗透测试漏洞流程:红队攻防流程详细大纲

web渗透测试漏洞流程 红队攻防文章跳转大纲前期准备漏洞分析内网阶段内网域渗透持续控制数据收集报告与总结&#xff1a; 红队攻防文章跳转大纲 前期准备 确定目标 明确攻击的目标系统和范围&#xff0c;包括其网络拓扑结构、IP 地址段、域名信息等。 收集信息 通过多种手…

ubuntu18安装opensips3.4,开启ws/wss/http接口模块

、如果是centos 7安装则使用yum 命令。 添加库地址注意系统类型&#xff0c;选择对应的系统类型和版本 curl https://apt.opensips.org/opensips-org.gpg -o /usr/share/keyrings/opensips-org.gpg echo "deb [signed-by/usr/share/keyrings/opensips-org.gpg] https:/…

git-gitlab ssh key配置成功后,使用ssh clone仓库时提示需要输入密码

本文仅记录自己遇到的问题及解决方案 问题现象&#xff1a;使用http或者ssh clone仓库时&#xff0c;总是提示ssl或者需要输入密码的问题&#xff0c;报错如下&#xff1a; git clone http://10.21.2.177/metaworks/metaworks-digitalhuman.git 正克隆到 metaworks-digitalhu…

C++中拷贝对象时编译器做出的一些优化

目录 拷贝对象时编译器做出的一些优化 参数传递优化 返回值优化 拷贝对象时编译器做出的一些优化 &#x1f4cc; 下面的优化结果由编译器决定&#xff0c;不同的编译器优化结果可能不同&#xff0c;视具体情况而定 参数传递优化 在前面的explicit关键字部分提到过编译器…

neo4j所有关系只显示RELATION,而不显示具体的关系

当看r时&#xff0c;真正的关系在properties中的type里&#xff0c;而type为“RELATION” 造成这个的原因是&#xff1a; 在创建关系时&#xff0c;需要指定关系的类型&#xff0c;这是固定的&#xff0c;不能像属性那样从CSV文件的一个字段动态赋值。标准的Cypher查询语言不支…

人工智能之Tensorflow变量作用域

在TensoFlow中有两个作用域&#xff08;Scope&#xff09;&#xff0c;一个时name_scope ,另一个是variable_scope。variable_scope主要给variable_name加前缀&#xff0c;也可以给op_name加前缀&#xff1b;name_scope给op_name加前缀。 variable_scope 通过所给的名字创建或…

C++中类和对象其他内容

目录 explicit关键字 static成员 static成员的介绍 static成员的使用 友元 友元函数 友元类 内部类 匿名对象 explicit关键字 在C中&#xff0c;给类对象初始化时会调用类的构造函数&#xff0c;但是也可以使用赋值运算符为构造函数只有一个参数&#xff08;或者只有…

Stable diffusion(四)

训练自己的Lora 【DataSet】【Lora trainer】【SD Lora trainer】 前置的知识 batch size&#xff1a;模型一次性处理几张图片。一次性多处理图片&#xff0c;模型能够综合捕捉多张图片的特征&#xff0c;最终的成品效果可能会好。但是处理多个batch size也意味着更大的显存…

nvm更换node.js的版本

自行下载nvm 打开cmd 1. nvm ls 列出目前已经下载的node版本&#xff0c;和正在使用的node版本 2. nvm install v版本号 下载某个版本 3. nvm uninstall v版本号 卸载某个版本 4. nvm use 版本号 切换到某个版本

深入理解栈和队列(二):队列

个人主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《数据结构》 一、队列的概念和结构 队列是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的…

吴恩达2022机器学习专项课程(一) 3.5 可视化成本函数

问题预览 为什么要可视化成本函数&#xff1f;可视化之后的成本函数是什么样子&#xff1f;如何在三维空间里通过w和b找到一个成本函数的值&#xff1f;如何在三维空间里找到成本函数的最小值&#xff1f; 解读 可视化成本函数&#xff1a;为了更加方便的看到不同的w和b&…

AI:152- 利用深度学习进行手势识别与控制

本文收录于专栏:精通AI实战千例专栏合集 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 每一个案例都附带关键代码,详细讲解供大家学习,希望可以帮到大家。正在不断更新中~ 一. 利用深度学习进行手势识别与控制 …

Acrobat Pro DC ----专业PDF编辑与管理

Acrobat Pro DC 2023是一款功能强大的PDF处理软件&#xff0c;它提供了丰富的编辑工具&#xff0c;支持创建、编辑、合并、分割PDF文件&#xff0c;以及高质量的PDF到其他格式的转换功能。同时&#xff0c;该软件集成了最新的OCR技术&#xff0c;可将扫描文档或图片转换成可编辑…

转座子插入位点分析4------PS转座子测序数据分析

观察数据 这是经公司使用fastp质控后的数据&#xff0c;我们先挑选部分数据进行比对&#xff0c;观察序列结构 为了准确性&#xff0c;我们再次挑选另一批数据进行比对 可以看到&#xff0c;所有序列都存在一个“GTGTCAAATACTTATTTTCCCCGCTGTA”的前导序列&#xff0c;这可能…

《大厂面试模拟(免费) - C++工程方向》

以个人的名义&#xff0c;提供c工程方向的大厂面试模拟&#xff0c;不会以任何形式收费。此面试可为应聘者提供真实反馈。简历和面试过程不会以任何形式给第三方&#xff08;包括我当前所在公司&#xff09;。 我的经验&#xff1a; 多年百度&#xff0c;阿里知名核心项目组工…

Linux快速安装FFmpeg、ffprobe、ffplay以及在Linux上的使用

文章目录 一、工具简介二、CentOS7上安装FFmpeg2.1 方法一&#xff1a;yum安装2.2 方法二&#xff1a;源码安装 三、ffprobe 在linux中的用法3.1 显示多媒体文件的基本信息3.2 显示特定流的信息3.3 获取音视频的时长 一、工具简介 这些工具都是与多媒体处理和流媒体相关的开源…