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
相关推荐
im_AMBER2 分钟前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
Polaris北4 分钟前
第二十九天打卡
算法
iOS开发上架4 分钟前
系统架构-信息系统
python·腾讯云
Lupino9 分钟前
从逻辑“脑裂”到 AI 重构:不到 2 美金解决物联网电位反转难题
python·物联网
样例过了就是过了11 分钟前
LeetCode热题100 环形链表 II
数据结构·算法·leetcode·链表
码农幻想梦12 分钟前
3472. 八皇后(北京大学考研机试题目)
考研·算法·深度优先
青春不败 177-3266-052017 分钟前
最新AI赋能Python长时序植被遥感动态分析、物候提取、时空变异归因及RSEI生态评估
人工智能·python·生态学·植被遥感·遥感·物候提取
NGINX开源社区25 分钟前
使用 Microsoft Entra ID 配置 NGINX Plus 以实现 SAML SSO
后端·python·flask
小鸡吃米…28 分钟前
基于 TensorFlow 的图像识别
人工智能·python·tensorflow
小鸡吃米…1 小时前
TensorFlow - 构建计算图
人工智能·python·tensorflow