Дан массив nums из n целых чисел и целевое значение target. Найдите три целых числа в nums, сумма которых ближе всего к цели. Возвращает сумму этих трех чисел. Предполагается, что для каждого набора входных данных существует только уникальный ответ.
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
решение
решение этой проблемы и15. Сумма трех чиселпохожи, просто сравнивая объекты из0
сталtarget
. Это также практика сортировки + двойные указатели.
- если
a+b+c ≥ target
, тоc
Соответствующий указатель перемещается на одну позицию влево - если
a+b+c < target
, тоb
Соответствующий указатель перемещается на одну позицию вправо
def threeSumClosest(nums, target):
nums.sort()
n = len(nums)
best = 10**7
# 根据差值的绝对值来更新答案
def update(cur):
nonlocal best
if abs(cur - target) < abs(best - target):
best = cur
# 枚举a
for i in range(n):
# 保证和上一次枚举的元素不相等
if i > 0 and nums[i] == nums[i - 1]:
continue
# 使用双指针枚举b, c
L, R = i + 1, n - 1
while L < R:
sum = nums[i] + nums[L] + nums[R]
# 如果和为target,那么它就是最接近的和,直接返回
if sum == target:
return target
update(sum) # 每次指针变化过后,更新答案
if sum < target:
# 如果和小于target,b 对应的指针向右移动一位
L0 = L + 1
# 移动到下一个不相等的元素
while L0 < R and nums[L0] == nums[L]:
L0 += 1
L = L0
else:
# 如果和大于target,c 对应的指针向左移动一位
R0 = R - 1
# 移动到下一个不相等的元素
while L < R0 and nums[R0] == nums[R]:
R0 -= 1
R = R0
return best
Анализ сложности
- Временная сложность: O(N^2), где N — длина массива nums. Сначала нам нужно O(NlogN) времени для сортировки массива, затем в процессе перечисления мы используем цикл O(N) для перечисления a и двойной указатель O(N) для перечисления b и c, так что общее количество равно O ( N ^ 2).
- Пространственная сложность: O(logN). Для сортировки требуется пространство O(logN). Однако мы модифицировали входной массив nums, что не обязательно разрешено в реальной ситуации, поэтому его также можно рассматривать как использование дополнительного массива для хранения копии nums и ее сортировки.На данный момент сложность пространства составляет O (Н).