↓快轉到主要內容
  1. LeetCode/

LeetCode 16: 3Sum Closest

·1 分鐘· ·
LeetCode Medium Array Two-Pointers Sorting
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-20

  • 提交紀錄:Wrong Answer ×2 → Accepted → Wrong Answer ×2 → Accepted ×2

解題思路
#

跟 3sum 一樣固定 nums[i]、用對撞指針(Two Pointers 模板一),每一組都用 abs(s - target) 更新最接近的和。和比 target 小就 l += 1 讓和變大,比較大就 r -= 1,剛好相等就可以直接回傳。

我的嘗試
#

第一版有三個錯:把第一個數取了負號(從 3sum 改過來時留下的)、比較距離沒有加 abs、指針移動只看兩個數的和。例如 [1, 1, 4]、target = 1 回傳的不是 6。2022 年 11 月重寫時又錯了兩次,都是比較距離的寫法不對。

正確解法
#

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort()
        best = nums[0] + nums[1] + nums[2]
        for i in range(len(nums) - 2):
            l, r = i + 1, len(nums) - 1
            while l < r:
                s = nums[i] + nums[l] + nums[r]
                if abs(s - target) < abs(best - target):
                    best = s
                if s < target:
                    l += 1
                elif s > target:
                    r -= 1
                else:
                    return s
        return best

複雜度
#

時間 O(n²),空間 O(1)。

要特別避免的錯誤
#

  • 比較要用絕對值;沒加 abs 時,比 target 小很多的和會被當成更接近。
  • 指針移動的條件要看整個三數和,不是只看兩個數。

面試口說整理
#

排序後我固定一個數,用左右指針找另外兩個,每一組用跟目標的距離更新答案;和太小就左指針右移,太大就右指針左移,相等直接回傳。時間 O(n²)。

相關文章

LeetCode 15: 3Sum
·2 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 15 解題筆記:排序後固定第一個數,剩下用對撞指針找兩數和;三個位置都要跳過相同的值,才不會有重複的組合
LeetCode 18: 4Sum
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 18 解題筆記:排序後兩層迴圈固定前兩個數,剩下用對撞指針;四個位置都要跳過相同的值
LeetCode 11: Container With Most Water
·1 分鐘
LeetCode Medium Array Two-Pointers Greedy
LeetCode 11 解題筆記:左右指針從兩端開始,每次移動比較矮的那一邊;移動高的那邊只會讓寬度變小、高度不會變高
LeetCode 977: Squares of a Sorted Array
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 977 解題筆記:平方後最大的一定在兩端,左右指針比較兩端的平方,大的從結果的最後面往前填
LeetCode 905: Sort Array By Parity
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 905 解題筆記:寫入指標把偶數交換到前面,跟 move zeroes 一樣
LeetCode 922: Sort Array By Parity II
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 922 解題筆記:偶數位置的指標 i、奇數位置的指標 j,各自跳兩格;i 放錯(奇數)時讓 j 找到放錯的偶數再交換