給定一個長度為 n
的整數數組 nums
和一個整數target
,在 nums
中找到三個整數,使得總和最接近target
。傳回三個整數的總和。可以假設每個輸入都有一個解決方案。
Input: nums = [-1, 2, 1, -4], target = 1
Output: 2
Explanation: 最接近目標值 1 的三元組為 [-1, 2, 1],其和為 2。
Input: nums = [0, 0, 0], target = 1
Output: 0
Explanation: 三數之和為 0,最接近目標值 1。
本題的目標是找到和最接近 target
的三元組,類似於 3Sum 問題,但這次我們不需要找出所有符合條件的三元組,而是找到最接近的和。
我們可以採用以下策略來解決這個問題:
思路
target
的差值。實現 (Python)
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
n = len(nums)
closest_sum = float('inf') # 初始化為無限大
for i in range(n):
for j in range(i + 1, n):
for k in range(j + 1, n):
current_sum = nums[i] + nums[j] + nums[k]
# 如果目前的和比之前更接近目標,則更新結果
if abs(current_sum - target) < abs(closest_sum - target):
closest_sum = current_sum
return closest_sum
時間與空間複雜度
思路
實現 (Python)
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort() # 將陣列排序
closest_sum = float('inf') # 初始化為無限大
n = len(nums)
for i in range(n):
left, right = i + 1, n - 1 # 雙指針
while left < right:
current_sum = nums[i] + nums[left] + nums[right]
# 更新最接近的和
if abs(current_sum - target) < abs(closest_sum - target):
closest_sum = current_sum
# 根據 current_sum 與 target 的大小調整指針
if current_sum < target:
left += 1
elif current_sum > target:
right -= 1
else:
return current_sum # 如果剛好等於 target,直接返回
return closest_sum
時間與空間複雜度
排序 + 雙指針 是本題的最佳解法,因為它在時間效率和實現簡潔性之間達到了很好的平衡。希望這篇詳細的教學能幫助你理解並解決這個問題!