1. Two Sum

1. Two Sum
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
dic = {}
for i in range(len(nums)):
if nums[i] in dic:
return [dic[nums[i]], I]
else:
dic[target - nums[i]] = I
15. 3Sum

15.3Sum
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort()
m = len(nums)
res = []
for i in range(m-2):
if i>0 and nums[i]==nums[i-1]:
continue
left = i + 1
right = m - 1
tgt = -nums[I]
while left < right:
if nums[left] + nums[right] == tgt:
res.append([nums[i], nums[left], nums[right]])
while left + 1 < right and nums[left+1] == nums[left]:
left += 1
while right - 1 > left and nums[right-1] == nums[right]:
right -= 1
left += 1
right -= 1
elif nums[left] + nums[right] > tgt:
right -= 1
else:
left += 1
return res
18. 4Sum

18. 4Sum
O(n3)
首先要排序,重复出现在三个地方,第一层循环,第二层循环,和left,right指针,在第一层,第二层循环要记录上一个值,如果相同就continue,当满足条件,添加之后,需要将left和right指针都移动得到和之前不相同的位置上。
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
res = []
nums.sort()
m = len(nums)
pre_i = None
for i in range(m-3):
if nums[i] == pre_i:
continue
pre_i = nums[i]
pre_j = None
for j in range(i+1, m-2):
if nums[j] == pre_j:
continue
pre_j = nums[j]
tgt = target - nums[i] - nums[j]
left = j + 1
right = m - 1
while left < right:
if nums[left] + nums[right] == tgt:
res.append([nums[i],nums[j],nums[left],nums[right]])
while left + 1 < right and nums[left+1] == nums[left]:
left += 1
while right - 1 > left and nums[right-1] == nums[right]:
right -= 1
left += 1
right -= 1
elif nums[left] + nums[right] > tgt:
right -= 1
else:
left += 1
return res
454. 4Sum II

454. 4Sum II
O(n2)
class Solution(object):
def fourSumCount(self, A, B, C, D):
"""
:type A: List[int]
:type B: List[int]
:type C: List[int]
:type D: List[int]
:rtype: int
"""
res = 0
mydic = {}
m, n = len(A), len(B)
for i in range(m):
for j in range(n):
temp = 0 - A[i] - B[j]
mydic[temp] = mydic.get(temp,0) + 1
m, n = len(C), len(D)
for i in range(m):
for j in range(n):
temp = C[i] + D[j]
if temp in mydic:
res += mydic[temp]
return res