简介
题目链接 LeetCode 1755. Closest Subsequence Sum
本题的标签是Divide and Conquer
和Meet in the Middle
,前者还好说,但是后者听起来就不像个算法,甚至从我个人角度来讲,这两个可以统称为Divide and Conquer
(分治法)。毕竟分治法,也可以简单的分成两份嘛,不用分那么复杂。
注意:文章中一切注解皆为Python代码
理解题目
题目非常简单。给定一个包含正负数字的列表,在所有可能的序列(sequence
)中,选出一个序列,使得序列之和与给定数字(goal
)的差的绝对值最小;也就是
min([abs(sum(s) - goal) for s in sequences])
最终返回这个值。
很明显,暴力解法就是找出所有可能形成的序列组合,求和后比较差值,这个方法的时间复杂度为O(2^N)
,即长度为N
的列表中,每个数字可以有两种选择(包含或者不包含),因此O(2^N)
。
暴力解法
过程非常简单,用set
找出所有的不重复的数列和,逐个跟goal
做减法求绝对值。
class Solution:
def minAbsDifference(self, nums: List[int], goal: int<