LeetCode算法题-Array Partition I(Java实现)

深入解析MSPM0系列Keil开发中‘ti_msp_dl_config.h‘缺失问题的根源与修复 本文深入解析TI MSPM0系列Keil开发中'ti_msp_dl_config.h'文件缺失问题的根源与修复方法。该错误常见于编译时提示file not found,主要因SysConfig工具未正确生成或工程路径配置错误导致。文章提供了从环境检查、手动生成文件到工程配置调整的系统化解决方案,帮助开发者快速解决这一常见KEIL开发难题。 阅读详情

这是悦乐书的第262次更新,第275篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第129题(顺位题号是561)。给定一个2n个整数的数组,你的任务是将这些整数分组为n对整数,比如说(a1,b1),(a2,b2),…,(an,bn),找出每对(ai, bi)中最小值,然后相加,使得其和最大。例如:

输入:[1,4,3,2]

输出:4

说明:n为2,对的最大总和为4 = min(1,2)+ min(3,4)。

注意:

  • n是正整数,其范围为[1,10000]。

  • 数组中的所有整数都在[-10000,10000]的范围内。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

题目要求我们计算每两个数中最小数之和的最大值。以题目中的数组为例,{1,4,2,3},四个数组成任意两对组合:

{(1,4),(2,3)},最小值之和为1+2=3

{(1,2),(4,3)},最小值之和为1+3=4

{(1,3),(4,2)},最小值之和为1+2=3

可以发现只有{(1,2),(4,3)}这一对的结果是最大的,从另外一个角度来讲,要想最后的和最大,那么每对数之间的差就要越小,因为两数之间差越大,大的数就被pass掉了,无法在后面的配对中起作用。所以,要想每对数之间的差越小,可以通过排序来完成,取相邻的数作为一对,计算最小值之和,也就变成求奇数位元素值之和了。

此解法的时间复杂度是O(n log(n)),空间复杂度是O(1)。

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

03 第二种解法

对于第一种解法,我们可以使用记数排序法,将时间复杂度降到O(n),但是要牺牲一定的空间。

记数排序法,在这里大致讲下,不展开。对于有限个数的整数数组,如果知道每个元素前面有多少位(排第几位),我们可以很快速的做出排序。

比如{1,7,5,2,8,2,7},使用一个长度为9的新数组(初始值为0)来记数,{0,1,2,0,0,1,0,2,1},其中不为0的数分别表示1个1,2个2,1个5,2个7,1个8,然后按照依次出现的次数打印出来(跳过元素值为0的索引)就变成{1,2,2,5,7,7,8},也就实现了排序。

这第二种解法就是利用记数排序来替换原来的比较排序,此解法的时间复杂度是O(n),最坏的情况是O(n+k),其中k是整数的范围,空间复杂度是O(n)。

public int arrayPairSum2(int[] nums) {
    // 原数组大小为20000,我们比它多一位即可
    int[] temp = new int[20001];
    // 原数组元素的取值范围是[-10000,10000],以旧数组的元素值作为索引,不能存在负值,所以加上10000
    // 统计每个元素出现的次数
    for (int i=0; i<nums.length; i++) {
        temp[nums[i]+10000]++;
    }
    // 新建一个和原数组大小一致的数组,来承接排序后的新元素值
    int[] temp2 = new int[nums.length];
    // 新数组temp2的索引值
    int index = 0;
    for (int i=0; i<temp.length; i++) {
        // 只有temp的元素不为0,说明遇到了nums的元素
        if (temp[i] != 0) {
            // 表明出现了temp[i]次的nums中的元素(i-10000),
            for (int j=0; j<temp[i]; j++) {
                // 上面对nums的元素加过10000,此处要还原
                temp2[index++] = i-10000;
            }
        }
    }
    int sum = 0;
    // 排完序后新的数组temp2,依旧取第奇数位元素相加求和
    for (int i=0; i<temp2.length; i += 2) {
        sum += temp2[i];
    }
    return sum;
}

04 第三种解法

对于第二种解法,我们还可以优化下,变得更加简单点。在记数完成后,直接对新数组中的数据进行处理。

因为我们只要排在第奇数位的元素,所以引用一个布尔类型的变量odd,当temp[i]大于0的时候,表示遇到了nums中的元素,拿到nums的元素依旧是新数组的索引i减去10000,加完一次后odd变量需要变成false,在第3次(奇数次)进来的时候,再加上当前元素,如果当前元素出现了多次的话。

public int arrayPairSum3(int[] nums) {
    int[] temp = new int[20001];
    for (int i=0; i<nums.length; i++) {
        temp[nums[i]+10000]++;
    }
    int sum = 0;
    boolean odd = true;
    for (int i=0; i<temp.length; i++) {
        while (temp[i] > 0) {
            if (odd) {
                sum += i-10000;
            }
            odd = !odd;
            temp[i]--;
        }
    }
    return sum;
}

05 小结

算法专题目前已日更超过三个月,算法题文章129+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

HT7036计量芯片SPI通信与数据读取实战解析 本文详细解析HT7036计量芯片的SPI通信与数据读取实战,涵盖SPI时序配置、命令发送、数据读取及常见问题排查。重点介绍如何通过SPI接口与MCU通信,实现电能数据的稳定采集与处理,为智能电表等应用提供实用解决方案。 阅读详情

相关推荐

反激系列-详细到每个容阻的原理之RCD吸收(1)

1、漏感尖峰电压会被RCD吸收,漏感能量一定,电容越大,电容充电的电压就越低,吸收能力就越强,MOS漏极的电压就越低。2、在漏感能力释放完之后(这个过程一般只有一个周期的3%时间),是要通过R1释放掉电容吸收的能量的,把电容的电压降下来方便下一次漏感尖峰来之前再进行吸收。3、电容容量和电阻需要合理搭配,容量足够即可,足够能吸收漏感尖峰电压,不至于超过MOS耐压。电阻需要足够小,小到在放电阶段把电容电压下降到MOS的电压平台。

Cuxiaoweiba的博客 3万+

leetcode 561 Array Partition I -Java(Arrays.sort())

Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), …, (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possib...

DurianPudding的博客 306

【自动驾驶学习笔记——Prescan和Simulink 学习笔记和问题记录(1)】

主要记录一些Prescan/Simulink 联合仿真出现的问题。

ly1336545868的博客 1465

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

class Solution { public int arrayPairSum(int[] nums) { Arrays.sort(nums); int max=0; for(int i=0;i<nums.length-1;i+=2){ max+=Math.min(nums[i],nums[i+1]) ; ...

xiaohanguo_xiao的博客 5243

#Linux内存管理# 用一个案例详细介绍ARMv7-A架构 缺页中断处理的原理

跳转到异常向量:根据 异常向量表基地址(通常配置在 VBAR 寄存器中,例如 0xFFFF0000) + 数据中止异常的偏移量 0x10,跳转到数据中止异常的处理程序入口点 0xFFFF0010(实践中,这个入口通常是一条跳转到更复杂处理函数的指令)。malloc 通常不会立即分配物理内存页,它只是在内核为该进程维护的虚拟地址空间中找到一段足够大的空闲虚拟地址区域(比如 0x00008000 - 0x00008FFF),标记为已用,并返回起始地址(例如 0x00008000)给程序。

sinat_37817094的博客 993

【短距离通信】【WiFi】精讲WiFi 6E协议!图解超赞超详细!!!

802.11ax(HE,HighEfficiency) (Wi-Fi 6E):6G频段共有1200MHz的频谱给到WiFi 6E使用,可用于从5.925GHz到7.125GHz。WiFi将可以访问59个20MHz信道,29个40MHz信道14个80MHz信道和7个160MHz信道。这不仅代表可以有很多频道,还可以代表可以解锁更高的数据速率。因为 802.11ax 标准(Wi-Fi 6)也在 2.4GHz 和 5GHz 频段运行,所以 6GHz 频段的 Wi-Fi 将被命名为 Wi-Fi 6E。

风云说通信 2347

Leetcode学习(3)—— Array Partition I

Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), …, (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possibl

HeatDeath的博客 830

人形机器人电源系统硬件开发:从原理图设计到PCB布局的完整流程

人形机器人是“移动的智能终端”,其电源系统如同“心脏+血管”:既要为大脑(主控)、肌肉(电机)、感官(传感器)提供稳定能量,又要在有限体积内应对高动态负载(如跳跃时电机瞬间大电流)。本文聚焦“硬件开发”维度,覆盖从需求分析到PCB制板的完整流程,适合硬件工程师、机器人爱好者快速掌握工程实战方法。

AI天才研究院 2177

LeetCode 561. Array Partition I

Array Partition I 题目描述: Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi

i逆天耗子 435

k8s 不同node之间pod ip不通

底层k8s使用calico网络,ipip网络模式,kubevirt启动了2台虚拟机;在这两台虚拟机上再搭建k8s,calico网络,ipip网络模式。说明:我是使用helm安装的calico,改这个模式要改crd资源ippools。其他方式安装的calico修改方法可能不一样。在虚拟机上的k8s上启动了2个pod,分布在不同的node上,这两个pod不能ping通对方的pod ip。修改虚拟机之上的k8s集群的calico网络的ipipMode为Never即可,之前使用的是Always。

weixin_40548182的博客 4056

电磁场仿真:电磁场基础理论_(13).微波技术基础

微波是指频率在300 MHz到300 GHz之间的电磁波。这一频率范围对应的波长为1米到1毫米。

2401_87715305的博客 1320

Leetcode 561: Array Partition I

题目传送门: Leetcode 561. Array Partition I题目: Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), …, (an, bn) which makes sum of min(ai,

丫丫狸笫的专栏 615

SAP GR(Group Reporting)配置篇(一)

GUI组报表的SAP S4HANA1.1全局参数1.1.1 检查全球系统设置菜单路径组报表的SAP S4HANA>合并的全局设置>检查全球系统设置事务代码CXB3说 明定义好分类账、版本、合并科目表后,重新设置。1.2主数据1.2.1定义合并分类账菜单路径组报表的SAP S4HANA>主数据>定义合并分类账事务代码CXL2说 明复制的Y1合并分类账,集团货币为CNY。此功能对分类账进行设置,应用到集团货币分类。

weixin_43853754的博客 1700

【Leetcode】561. Array Partition I

题目地址: https://leetcode.com/problems/array-partition-i/ 题目大意是,给定2n2n2n个整数,将它们两两分组分成nnn个组,并对每组较小的数求和,问如何分组使得,这样的和最小,求出数值。 题目并不难,直觉上只需要从小到大排序,然后选第0,2,4,...,2n−20,2,4,...,2n-20,2,4,...,2n−2个数求和就行了。代码如下: i...

数学、算法爱好者的博客 255

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Array Partition I

Problem (from Leetcode) [1]: Given an array of2nintegers, your task is to group these integers intonpairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi) for al...

qq_24004629的博客 189

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

[Leetcode] 561. Array Partition I

link: https://leetcode.com/problems/array-partition-i/ Solution: Sort以后取偶数位数字之和 Sort以后取相邻会使得min(a, b)之和最小的原因是: 假设a > b,则对于最后的结果,取(a, b)造成的损失是a-b 要使得损失最小,则a和b要离得最近,即相邻 class Solution { public in...

Renoler的博客 165

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[LeetCode]561. Array Partition I (数组分区 1)

561. Array Partition IGiven an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), …, (an, bn) which makes sum of min(ai, bi) for all i from 1 to

whl_program的博客 6628

LeetCode 1013. Partition Array Into Three Parts With Equal Sum (Java版; Easy)

welcome to my blog LeetCode 1013. Partition Array Into Three Parts With Equal Sum (Java版; Easy) 题目描述 Given an array A of integers, return true if and only if we can partition the array into three non-...

littlehaes的博客 604

LeetCode——561. 数组拆分 I(Array Partition I)[简单]——分析及代码(Java)

LeetCode——561. 数组拆分 I[Array Partition I][简单]——分析及代码[Java]一、题目二、分析及代码1. 排序(1)思路(2)代码(3)结果三、其他 一、题目 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最大总和 。 示例 1: 输入:nums = [1,4,3,2] 输出:4 解释:所有可能的分法(忽

江南土豆的博客 275

#力扣 LeetCode561. 数组拆分 I @FDDLC

题目描述: https://leetcode-cn.com/problems/array-partition-i/ Java代码: class Solution { public int arrayPairSum(int[] a) { Arrays.sort(a); for(int i=2;i<a.length;i+=2)a[i]+=a[i-2]; return a[a.length-2]; } } ...

LiuXingchang的博客 285

Leetcode 561. Array Partition I, Java解法

Given an array of2nintegers, your task is to group these integers intonpairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as poss...

YuanTheCoder的博客 369

Java描述 LeetCode,561. Array Partition I 数组拆分i

大家好,我是河海哥,专注于后端,如果可以的话,想做一名code designer而不是普通的coder,一起见证河海哥的成长,您的评论与赞是我的最大动力,如有错误还请不吝赐教,万分感谢。 1-1:题目 Given an integer array nums of 2n integers, group these integers into n pairs (a1, b1), (a2, b2), …, (an, bn) such that the sum of min(ai, bi) for all i .

人在江湖 505

【LeetCode】 1013. Partition Array Into Three Parts With Equal Sum 将数组分成和相等的三个部分(Easy)(JAVA)

【LeetCode】 1013. Partition Array Into Three Parts With Equal Sum 将数组分成和相等的三个部分(Easy)(JAVA) 题目地址: https://leetcode.com/problems/partition-array-into-three-parts-with-equal-sum/ 题目描述: Given an array A o...

qq_16927853的博客 225

leetcode 561. Array Partition I

Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large a

淡然坊 521

561. Array Partition I

/** * Created by Joe on 2018/4/6. * 561. Array Partition I * https://leetcode.com/problems/array-partition-i/description/ */ public class P561 { public int arrayPairSum(int[] nums) { A...

用时间去蜕变 218

【LeetCode】561. Array Partition I 解题报告(Java & Python)

【LeetCode】Array Partition I 解题报告标签(空格分隔): LeetCode题目地址:https://leetcode.com/problems/array-partition-i/#/description题目描述:Given an array of 2n integers, your task is to group these integers into n pairs

负雪明烛 2832
上一篇: LeetCode算法题-Maximum Depth of N-ary Tree(Java实现)
下一篇: LeetCode算法题-Binary Tree Tilt(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值