==== Step 1 ==== # nums 排序過 # i 是固定的數值 # l, r 分別是 left pointer 和 right pointer [-4,-1,-1,0,1,2] i l r # 因為還太小,我們透過移動l來使總合變大 nums[i] + nums[l] + nums[r] = -3
==== Step 2 ==== [-4,-1,-1,0,1,2] i l r # 因為還太小,我們透過移動l來使總合變大 nums[i] + nums[l] + nums[r] = -3
==== Step 3 ==== [-4,-1,-1,0,1,2] i l r # 因為還太小,我們透過移動l來使總合變大 nums[i] + nums[l] + nums[r] = -2
==== Step 4 ==== [-4,-1,-1,0,1,2] i l r # 因為還太小,我們透過移動l來使總合變大 nums[i] + nums[l] + nums[r] = -1
==== Step 5 ==== # 觸底了...都還沒找到,表示當前的i無法找到解 [-4,-1,-1,0,1,2] i r l
nums[i] + nums[l] + nums[r] = -1
基本上從上面的程式碼就可以寫出以下程式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution: defthreeSum(self, nums: List[int]) -> List[List[int]]: ans = set() # 存放所有的組合 避免重複 nums.sort() # 排序 target = 0 # 固定i for i inrange(len(nums)): l, r = 0, len(nums)-1 while l < r: tot = nums[i] + nums[l] + nums[r] if tot == target: ans.add((nums[i], nums[l], nums[r])) l += 1 r -= 1 elif tot < target: l += 1 else: r -= 1 returnlist(ans) # 轉成list
defthreeSum(self, nums: List[int]) -> List[List[int]]: res = [] nums.sort() for idx inrange(len(nums)): # i 也是相同的意思,如果與上一個相同就跳過避免重複 if idx > 0and nums[idx] == nums[idx-1]: continue
left, right = idx + 1, len(nums) - 1 while left < right: total = nums[idx] + nums[left] + nums[right] if total > 0: right -= 1 elif total < 0: left += 1 else: res.append([nums[idx], nums[left], nums[right]]) left += 1 # 使用list不重複的關鍵在,如果left下一個與上一個相同要繼續往下走否則會重複 while nums[left] == nums[left-1] and left < right: left += 1 return res