LeetCode 1755. Closest Subsequence Sum (时间复杂度为2^N时的数学优化)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

题目链接 LeetCode 1755. Closest Subsequence Sum

本题的标签是Divide and ConquerMeet 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<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值