简介
题目链接 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)

博客介绍了LeetCode 1755题目的解法,从暴力求解到使用二分法优化,将时间复杂度从2^N降至O(N log N)。通过将数列分为两部分,对其中一个列表排序,然后针对另一列表的每个元素使用二分搜索,寻找最小绝对差值。解题后的思考指出二分法在降低时间复杂度上的关键作用。
最低0.47元/天 解锁文章
5万+





