561. 数组拆分 递归思想 数学规律 python 力扣

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 <= 104
  • nums.length == 2 * n
  • -104 <= nums[i] <= 104

题解:

刚刚看到这个题有点懵逼,自己写了几个例子观察后发现这个是排序后然后取每对元素左边的一个元素,如何相加。这里简要证明一下:如nums = [1,4,3,2],如果我们想舍去一个元素让剩下的元素最大,我们舍弃谁呢?当然是1.如果舍弃一对数的话,我们可以舍弃[1,2]吗?显然是不能的,因为题意取的是一对数里面最小的元素,而1,2已经是最小的数。用递归的思想来解释,我们为了把1舍弃就必须找一个元素给他'陪葬',这个元素最好是比1大一点点的那个数,这样才能保持剩余的元素最大。

参考代码如下:

复制代码
class Solution(object):
    def arrayPairSum(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums=sorted(nums)
        ans=0
        for i in range(len(nums)):
            if i%2==0:
                ans+=nums[i]
        return ans
相关推荐
爱尔兰极光1 分钟前
LeetCode热题100--两数之和
算法·leetcode·职场和发展
2301_822382764 分钟前
模板编译期排序算法
开发语言·c++·算法
m0_561359679 分钟前
嵌入式C++调试技术
开发语言·c++·算法
yuan1999713 分钟前
高光谱遥感图像异常检测KRX算法Matlab实现
算法·机器学习·matlab
努力学习的小廉13 分钟前
我爱学算法之—— 回溯
算法·深度优先
2301_7634724613 分钟前
C++中的享元模式高级应用
开发语言·c++·算法
hcnaisd215 分钟前
使用Python进行PDF文件的处理与操作
jvm·数据库·python
不会代码的小测试15 分钟前
UI自动化-针对验证码登录的系统,通过首次手动登录存储cookie的方式后续访问免登录方法
开发语言·python·selenium
weixin_4589232016 分钟前
分布式日志系统实现
开发语言·c++·算法