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
相关推荐
u01368638213 分钟前
将Python Web应用部署到服务器(Docker + Nginx)
jvm·数据库·python
小O的算法实验室29 分钟前
2026年KBS,赏金猎人优化算法+多无人机移动边缘计算与路径规划,深度解析+性能实测
算法·无人机·边缘计算
用户56715047102137 分钟前
OpenClaw 记忆管理系统技术文档
算法
smchaopiao1 小时前
Python中字典与列表合并的问题与解决方法
开发语言·python
935961 小时前
练习题53-60
算法·深度优先
卡尔特斯1 小时前
Ultralytics YOLO26 自动对指定标注文件夹区分标注素材脚本与训练脚本
python·openai
霖大侠1 小时前
Wavelet Meets Adam: Compressing Gradients forMemory-Efficient Training
人工智能·深度学习·算法·机器学习·transformer
2501_921649491 小时前
期货 Tick 级数据与基金净值历史数据 API 接口详解
开发语言·后端·python·websocket·金融·区块链
njidf1 小时前
实战:用Python开发一个简单的区块链
jvm·数据库·python
Rick19931 小时前
慢SQL优化
数据库·python·sql