2sum
-
题目描述
Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same element twice. -
示例
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]. -
分析
思路不是很难,因为假设只有一种解决方法,所以直接采用固定一个数,寻找另一个数是否在数组中即可,这样的复杂度为O(n2),需要寻找一个O(n)复杂度的解法,可以建立一个字典,将遍历过的数和索引放在字典中,空间换时间。
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
dict = {}
for i in range(len(nums)):
other = target-nums[i]
if other in dict:
res=[dict[other],i]
return res
dict[nums[i]] = i
3sum
-
题目描述
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. -
示例
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
] -
分析
解决问题的关键点在于降重,用一种O(n2)的的方式计算,同样先排序,很重要,然后再固定一个数,找另外的两个数,这两个数分别用左右指针前后一起遍历,注意计算过程中的降重
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if nums==None or len(nums)<3:
return
nums.sort()
res=[]
for i in range(len(nums)-2):
if i == 0 or nums[i]>nums[i-1]:
left,right = i+1,len(nums)-1
while left < right:
if nums[left]+nums[right]==-nums[i]:
res.append([nums[i],nums[left],nums[right]])
left+=1
right-=1
while left<right and nums[left]==nums[left-1]: left+=1
while left<right and nums[right] == nums[right+1]: right-=1
elif nums[left]+nums[right]<-nums[i]:
while left<right:
left+=1
if nums[left]>nums[left-1]:
break
else:
while left<right:
right-=1
if nums[right]<nums[right+1]:
break
return res