# Leetcode 15 three sum two pointer
#### 使用 set 作為ans_set 可避免重複數組
### enumerate python 技巧
```python=
list1[1,3,5,7,9]
for index, num in enumerate(list1):
print('index:',i , 'num:',num)
```
My Solution 時間O(n^2)
---
```python=
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)
---
```python=
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`