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

LeetCode 18: 4Sum

·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

  • 提交紀錄:Runtime Error ×9 → Wrong Answer ×9 → Accepted ×3 → Wrong Answer → Accepted ×2

解題思路
#

在 3sum 外面再包一層(Two Pointers 模板一):i、j 固定前兩個,l、r 對撞找剩下兩個。去重跟 3sum 一樣,i、j 跟前一個相同就跳過,找到一組之後 l 跳過相同的值。

我的嘗試
#

這題 2022 年提交了 24 次:

  • 前面十次 RE 大多是變數沒定義、None 取值或 index 超出範圍。
  • 之後的 WA 都在去重:找到一組之後沒有跳過相同的值,例如 [2, 1, 3, -2, 1]、target = 4 回傳兩個 [-2, 1, 2, 3];也有一版跳過太多,[1, -1, 3, 0]、target = 3 什麼都沒找到。

正確解法
#

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        n, res = len(nums), []
        for i in range(n - 3):
            if i and nums[i] == nums[i - 1]:
                continue
            for j in range(i + 1, n - 2):
                if j > i + 1 and nums[j] == nums[j - 1]:
                    continue
                l, r = j + 1, n - 1
                while l < r:
                    s = nums[i] + nums[j] + nums[l] + nums[r]
                    if s < target:
                        l += 1
                    elif s > target:
                        r -= 1
                    else:
                        res.append([nums[i], nums[j], nums[l], nums[r]])
                        l += 1
                        while l < r and nums[l] == nums[l - 1]:
                            l += 1
                        r -= 1
        return res

複雜度
#

時間 O(n³),空間 O(1)(不算輸出)。

要特別避免的錯誤
#

  • j 的去重條件是 j > i + 1,不是 j > 0,不然會跳過合法的組合。

面試口說整理
#

排序後我用兩層迴圈固定前兩個數,再用左右指針找後兩個,四個位置都跳過相同的值避免重複。時間 O(n³)。

相關文章

LeetCode 15: 3Sum
·2 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 15 解題筆記:排序後固定第一個數,剩下用對撞指針找兩數和;三個位置都要跳過相同的值,才不會有重複的組合
LeetCode 16: 3Sum Closest
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 16 解題筆記:排序後固定一個數,對撞指針找另外兩個;比較的是和跟 target 的距離 abs(sum - target)
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 找到放錯的偶數再交換