Python贪心算法:1、数组拆分
算法思路难度:☆
编程实现难度:☆
题目描述
思路
1、要求的是最大总和,那么应该让求和的每一个数都尽可能的大。
即让min(a, b)尽可能的大,也就是要让(a,b)中最小的那个数尽可能的大。
2、(a, b)中所有的数都来自于给定的列表中,每个数只能用一次。
这就要求我们要减少浪费,(a, b)组合中较小的那个数会保留,而另一个数则会被抛弃,也就造成了浪费。我们要少浪费大一点的数,从而产生更大的和。这样就需要在做到第一点的基础上让|a - b|尽可能的小。
基于以上两点思考,我们首先需要排序,并且选取相邻的两个数作为一组,这样保证|a - b|尽可能的小。
以示例一为例:nums_sorted_reversed = [4, 3, 2, 1]。这样再来观察一下,上述两个思考点同时得到了满足,分成两个组(4, 3)和(2, 1),这两个组的总和为3+1=4。
总结规律:间隔选取求和,如升序排序选取偶数下标元素求和,如降序排序选取奇数下标元素求和。
代码
class Solution:
def arrayPairSum(self, nums: List[int]) -> int:
return sum(sorted(nums)[::2]) # 升序排序
class Solution:
def arrayPairSum(self, nums: List[int]) -> int:
return sum(sorted(nums)[-2::-2]) # 降序排序
class Solution:
def arrayPairSum(self, nums: List[int]) -> int:
nums.sort(reverse=True)
return sum(nums[1::2]) # 好理解一点的降序排序