Try   HackMD

Leetcode 15 three sum two pointer

使用 set 作為ans_set 可避免重複數組

enumerate python 技巧

list1[1,3,5,7,9] for index, num in enumerate(list1): print('index:',i , 'num:',num)

My Solution 時間O(n^2)

def threeSum(self, nums): # 先將輸入數列排序後呈 [-4,-1,-1,0,1,2] nums = sorted(nums) length = len(nums) sol_list = set() if length < 3: return sol_list for index in range(length): pivot_index = index if nums[pivot_index] > 0: # 不可能相加 = 0 return sol_list if index >=1 and nums[index-1] == nums[index]: continue # 設定其餘數列相加pivot 為 0 target = 0 - nums[index] target_map = {} # 利用dict 去尋找有無適合值 for pivot_index in range(pivot_index+1,length): if target_map.__contains__(target-nums[pivot_index]): #如果dict內有key 符合 target-nums[pivot_index] #代表條件符合新增於ans_list sol_list.add((nums[index], target-nums[pivot_index],nums[pivot_index])) else: # 紀錄值在target_map內利後續查詢 target_map[nums[pivot_index]] = pivot_index return sol_list

Best Solution Two pointer
時間O(n^2)

def threeSum(self, nums): # 先將輸入數列排序後呈 [-4,-1,-1,0,1,2] nums = sorted(nums) length = len(nums) sol_list = set() if length < 3: return sol_list for index in range(length-2): # 因為是已經排序過,所以nums[pivot_index] > 0 # 就不用繼續 if nums[index] > 0: break if index >=1 and nums[index-1] == nums[index]: continue # 想法為有兩個指標 l , r # 當 sum 過大 r-1,sum過小 l+1 l = index + 1 # 左邊index r = length - 1 # 右邊index while l < r: # 以 index 為主key 去嘗試 l & r 的值 sum = nums[index] + nums[l]+ nums[r] if sum < 0 : # 代表 left的值負太多 往右移 l += 1 elif sum > 0: # 代表 right 的值正太多 往左移 r -= 1 else: sol_list.add((nums[index],nums[l],nums[r])) l+=1; r-=1 return sol_list
tags: LeetCode three sum two pointer