优化最接近三数之和解决方案以避免超时错误
优化LeetCode三数最接近问题的超时解决方案
你的代码逻辑正确,但还有几个关键优化点可以大幅降低时间复杂度,解决超时问题:
核心优化点
找到最优解直接终止
当三数之和等于target时,这就是最接近的结果,无需继续遍历,直接返回target即可。你之前只break了内层while循环,外层for循环还会继续执行,这会浪费大量不必要的计算。跳过内层循环的重复元素
除了跳过i的重复值,内层的l和r遇到重复元素时也可以直接跳过,避免重复计算相同的三数组合。比如当nums[l]和nums[l+1]相等时,l可以直接跳到下一个不同的位置,同理r也是如此。初始化值优化
直接用数组前三个元素的和初始化csum,用这个和与target的差初始化min_diff,省去后续判断csum是否为None的逻辑,同时避免了边界情况的处理开销。调整diff更新时机
现有代码是先移动指针再更新最小差值,调整为先判断当前组合的差值是否更小,再移动指针,确保每个有效组合都被及时比较,逻辑更清晰且减少不必要的判断。
优化后的代码
class Solution: def threeSumClosest(self, nums: List[int], target: int) -> int: nums.sort() n = len(nums) # 初始化第一个可能的三数组合 csum = nums[0] + nums[1] + nums[2] min_diff = abs(target - csum) for i in range(n - 2): # 跳过i的重复元素 if i > 0 and nums[i] == nums[i-1]: continue l, r = i + 1, n - 1 while l < r: current_sum = nums[i] + nums[l] + nums[r] current_diff = abs(target - current_sum) # 更新最小差值和结果 if current_diff < min_diff: min_diff = current_diff csum = current_sum # 如果差值为0,直接返回,不可能更优 if min_diff == 0: return target # 移动指针并跳过重复元素 if current_sum > target: while l < r and nums[r] == nums[r-1]: r -= 1 r -= 1 else: while l < r and nums[l] == nums[l+1]: l += 1 l += 1 return csum
优化效果说明
- 提前终止逻辑能在找到完美匹配时立刻结束程序,避免后续所有循环。
- 内层重复元素跳过能减少大量重复的三数组合计算,尤其是在数组中有大量重复元素时效果显著。
- 初始化优化简化了代码逻辑,同时避免了边界情况的额外判断开销。
内容的提问来源于stack exchange,提问作者Suhail Gupta
相关产品推荐
相关产品推荐

