【力扣】561.数组拆分I--Python实现

【题目描述】
给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从 1 到 n 的 min(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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/array-partition-i

【解题思路】
题目的意思是要把2n个数据分成n对,然后每一对中取较小的一个数,最终把n个数加起来,希望这n个数的和最大。
考虑一种极端的情况:1,2,998,999
当然是把1,2分为一组,998,999分为一组,最终的结果为1+998=999
如果把1和998分到一组,2和999分到一组,就会把大数“浪费”掉。所以这道题需要的是把数组按照从小到达的顺序排列, 然后取偶数位的数(因为数组的下标是从0开始的)。
用Python实现的代码如下:

class Solution(object):
    def arrayPairSum(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums.sort()
        res = 0
        for i in range(len(nums)):
            if i%2==0:
                res += nums[i]
        return res

【进阶版思路】
以空间换时间,采用哈希,牺牲额外的O(n)空间,实现O(n)时间复杂度的解法。用一个偏置数组存储每个数出现的次数,然后每遇到偶数位,加到res里即可。用Python实现的代码如下:

class Solution(object):
    def arrayPairSum(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        arr = [0]*20001
        offset = 10000
        for item in nums:
            arr[item+offset] += 1
        
        flag = 1
        res = 0
        for i in range(len(arr)):
            if arr[i]>0:
                res = res + (arr[i]+flag)//2*(i-offset)
            if (arr[i]+flag)%2 == 0:
                flag=0
            else:
                flag=1
        
        return res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值