leetcode-561 } 数组拆分 I

561. 数组拆分 I

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

示例 3:
输入: [1,4,3,2]
输出: 4
解释: n 等于 2, 最大总和为 4 = min(1, 2) + min(3, 4).

提示:
n 是正整数,范围在 [1, 10000].
数组中的元素范围在 [-10000, 10000].

思考

由于是取两个数的二元组中的最小值,需要求和的最大值,也就是说当我们需要值最大的时候,而整个2n数组,最大值是一定抛弃的(因为min(a, b)),那么次大值必在其中。
不妨将之排序,从后到前组成二元组,此时绝壁是最大的。

class Solution(object):
    def arrayPairSum(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 0:
            return 0
        if len(nums)<2:
            return sum(nums)

        nums.sort(reverse=True)
        i, j  = 0, 1
        sum = 0
        while j < len(nums):
            m = min(nums[i], nums[j])
            sum += m
            i = j + 1
            j = i + 1
        return sum

结果:

执行用时 : 536 ms, 在Array Partition I的Python提交中击败了15.09% 的用户
内存消耗 : 14.1 MB, 在Array Partition I的Python提交中击败了35.37% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过536 ms14.1MBpython
## 优化 由于我们已经确定了所取的位置的数据,所以我们可以直接取数
class Solution(object):
    def arrayPairSum(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 0:
            return 0
        if len(nums)<2:
            return sum(nums)

        nums.sort(reverse=True)
        i =  1
        sum = 0
        while i < len(nums):
            sum += nums[i]
            i += 2
        return sum

结果:

执行用时 : 384 ms, 在Array Partition I的Python提交中击败了29.24% 的用户
内存消耗 : 14 MB, 在Array Partition I的Python提交中击败了39.74% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过384 ms14MBpython

再次优化

不难发现,解法还是不好,不难理解因为我们使用的是sort函数
我们不妨反过来理解一下,由于取次大,所以我们需要取最小
故而我们都不需要逆排序,直接排序然后计算就可以了

class Solution(object):
    def arrayPairSum(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 0:
            return 0
        if len(nums)<2:
            return sum(nums)

        nums.sort()
        i =  0
        sum = 0
        while i < len(nums):
            sum += nums[i]
            i += 2
        return sum

结果:

执行用时 : 352 ms, 在Array Partition I的Python提交中击败了85.38% 的用户
内存消耗 : 14.1 MB, 在Array Partition I的Python提交中击败了32.31% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过352 ms14.1MBpython

   Reprint policy


《leetcode-561 } 数组拆分 I》 by 梦否 is licensed under a Creative Commons Attribution 4.0 International License
 Previous
leetcode-1002 | 查找常用字符 I leetcode-1002 | 查找常用字符 I
1002. 查找常用字符给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。 你可以按
2019-06-03
Next 
leetcode-1051 | 高度检查器 leetcode-1051 | 高度检查器
1051. 高度检查器学校在拍年度纪念照时,一般要求学生按照 非递减 的高度顺序排列。 请你返回至少有多少个学生没有站在正确位置数量。该人数指的是:能让所有学生以 非递减 高度排列的必要移动人数。 示例:输入:[1,1,4,2,1,3]输
2019-06-03
  TOC