1. 程式人生 > 實用技巧 >LeetCode #18 4Sum

LeetCode #18 4Sum

題目

4Sum


解題方法

這是一道3Sum的變題,可以把它看作是遍歷陣列,每次在比當前數更大的數中做3Sum操作,除了多一層迴圈以外其他與3Sum類似,可以用頭尾雙指標或者雜湊表來做。

再在此題的基礎上引申一下,可以寫出kSum的程式碼,將k作為一個引數傳遞進入函式,再進行遞迴呼叫,最終簡化為在一個區間上的2Sum問題。


程式碼

雙指標法

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        if len(nums) < 4:
            return []
        res = set()
        nums.sort()
        
        for i in range(len(nums)-3):
            if nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target:
                break
            if i and nums[i] == nums[i-1]:
                continue
            for j in range(i+1, len(nums)-2):
                if j != i+1 and nums[j] == nums[j-1]:
                    continue
                low = j + 1
                high = len(nums)-1
                while low < high:
                    Sum = nums[i] + nums[j] + nums[low] + nums[high]
                    if target > Sum:
                        low += 1
                    elif target < Sum:
                        high -= 1
                    else:
                        res.add((nums[i], nums[j], nums[low], nums[high]))
                        low += 1
                        high -= 1
        
        return map(list, res)