[LeetCode解題攻略] 16. 3Sum Closest

更新於 發佈於 閱讀時間約 6 分鐘

題目描述

給定一個長度為 n 的整數數組 nums 和一個整數target,在 nums 中找到三個整數,使得總和最接近target。傳回三個整數的總和。可以假設每個輸入都有一個解決方案。

  1. 範例 1
    Input: nums = [-1, 2, 1, -4], target = 1
    Output: 2
    Explanation: 最接近目標值 1 的三元組為 [-1, 2, 1],其和為 2
  2. 範例 2
    Input: nums = [0, 0, 0], target = 1
    Output: 0
    Explanation: 三數之和為 0,最接近目標值 1

解題思路

本題的目標是找到和最接近 target 的三元組,類似於 3Sum 問題,但這次我們不需要找出所有符合條件的三元組,而是找到最接近的和

我們可以採用以下策略來解決這個問題:

  1. 暴力解法:枚舉所有三元組,計算它們的和並更新最接近目標的結果。
  2. 排序 + 雙指針:將陣列排序後,利用雙指針的優化來有效縮小搜尋範圍。

解法 1:暴力解法

思路

  • 使用三層迴圈,枚舉所有可能的三元組,計算每個三元組的和與 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

時間與空間複雜度

  • 時間複雜度:O(n³),三層迴圈遍歷所有可能的三元組。
  • 空間複雜度:O(1),除了變數儲存外,無額外空間使用。

解法 2:排序 + 雙指針

思路

  1. 排序陣列:先將陣列排序,這樣可以方便使用雙指針技巧。
  2. 固定一個數字,然後在剩下的陣列中尋找最接近的兩數和
    • 遍歷陣列中的每個數字作為固定值 nums[i]。
    • 使用雙指針在剩下的陣列中尋找最接近 target - nums[i] 的兩數和。
  3. 更新結果:比較每組三元組的和與目標值的接近程度,並更新結果。

實現 (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

時間與空間複雜度

  • 時間複雜度:O(n²)
    • 排序的時間複雜度為 O(n log n),雙指針遍歷的時間複雜度為 O(n²),總計 O(n²)。
  • 空間複雜度:O(1)
    • 除了排序外,僅需使用額外變數儲存指針與結果。

總結

排序 + 雙指針 是本題的最佳解法,因為它在時間效率和實現簡潔性之間達到了很好的平衡。希望這篇詳細的教學能幫助你理解並解決這個問題!

留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
7會員
128內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/04/04
給定一個非負整數陣列 nums,其中 nums[i] 代表你在索引 i 處最多可以向右跳幾步。 請判斷是否能夠從索引 0 跳到最後一個索引。
2025/04/04
給定一個非負整數陣列 nums,其中 nums[i] 代表你在索引 i 處最多可以向右跳幾步。 請判斷是否能夠從索引 0 跳到最後一個索引。
2025/03/28
給定一個 m x n 的矩陣 matrix,請按照 螺旋順序(spiral order) 返回矩陣中的所有元素。
2025/03/28
給定一個 m x n 的矩陣 matrix,請按照 螺旋順序(spiral order) 返回矩陣中的所有元素。
2025/03/20
這道題是 LeetCode 的經典題之一,要求我們找出 一個子陣列,使其和最大,並返回這個最大和的數值。
2025/03/20
這道題是 LeetCode 的經典題之一,要求我們找出 一個子陣列,使其和最大,並返回這個最大和的數值。
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
題目敘述 題目會給定一個整數陣列nums,要求我們找出最大的兩個整數a, b,返回(a-1) * (b-1)的乘積。 詳細的題目可在這裡看到 測試範例 Example 1: Input: nums = [3,4,5,2] Output: 12
Thumbnail
題目敘述 題目會給定一個整數陣列nums,要求我們找出最大的兩個整數a, b,返回(a-1) * (b-1)的乘積。 詳細的題目可在這裡看到 測試範例 Example 1: Input: nums = [3,4,5,2] Output: 12
Thumbnail
題目會給我們一個陣列nums,要求我們以每個陣列元素分別當作軸心點,計算差值的絕對值總和,最後以陣列的形式,返回答案。 測試範例 Example 1: Input: nums = [2,3,5] Output: [4,3,5]
Thumbnail
題目會給我們一個陣列nums,要求我們以每個陣列元素分別當作軸心點,計算差值的絕對值總和,最後以陣列的形式,返回答案。 測試範例 Example 1: Input: nums = [2,3,5] Output: [4,3,5]
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
題目會給我們一個整數陣列nums,裡面都是正整數,而且陣列長度保證是偶數。 要求我們倆倆將所有整數配對成一組pair,要求我們最小化pair sum的極大值。
Thumbnail
題目會給我們一個整數陣列nums,裡面都是正整數,而且陣列長度保證是偶數。 要求我們倆倆將所有整數配對成一組pair,要求我們最小化pair sum的極大值。
Thumbnail
題目會給定我們一個陣列,並且定義了一種三角形合併的操作。 當下這一排相鄰的兩項相加,對mod 10取餘數,會成為下一排的對應項,一直反覆操作,直到剩下一個元素為止。 要求我們返回最後一層的答案。 測試範例: Example 1: Input: nums = [1,2,
Thumbnail
題目會給定我們一個陣列,並且定義了一種三角形合併的操作。 當下這一排相鄰的兩項相加,對mod 10取餘數,會成為下一排的對應項,一直反覆操作,直到剩下一個元素為止。 要求我們返回最後一層的答案。 測試範例: Example 1: Input: nums = [1,2,
Thumbnail
題目:建立一個函數,該函數返回給定最小 4 個正整數的數組的兩個最低正數的總和。不會傳入浮點數或非正整數。例如,當一個數組像 [19, 5, 42, 2, 77], 輸出應該是 7。 [10, 343445353, 3453445, 3453545353453] 應該回來 3453
Thumbnail
題目:建立一個函數,該函數返回給定最小 4 個正整數的數組的兩個最低正數的總和。不會傳入浮點數或非正整數。例如,當一個數組像 [19, 5, 42, 2, 77], 輸出應該是 7。 [10, 343445353, 3453445, 3453545353453] 應該回來 3453
Thumbnail
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
Thumbnail
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News