题目
输入一个listl
和一个整数n
,判断l
中是否有两个元素的和等于n
例子
- None输入 -> False
- [],3 -> False
- [1,3,5],4 -> True
- [2,3,4,6],11 -> Flase
假设
- list中元素均为整数
tips
- 利用两重循环搜索
- 记录已出现过的值
答案
解法1:
def two_sum(l, n):
if l is None or n is None:
return False
for i in range(len(l)):
for j in range(i + 1,len(l)):
if l[i] + l[j] == n:
return True
return False
性能:
- 时间复杂度
O(n^2)
- 空间复杂度
O(1)
关键点:1.两重循环搜索
解法2:
def two_sum(l, n):
if l is None or n is None:
return False
memo = {}
for x in l:
need = n - x
if memo.get(need):
return True
memo[x] = True
return False
性能:
- 时间复杂度O(n)
- 空间复杂度O(n)
关键点:
- 利用dict记录出现过的数字,后续直接查找dict即可
解法3:
def two_sum(l, n):
if l is None or n is None:
return False
for x in l: # O(n)
"""
1. 遍历l,判断n-x是否在l中
2. 如果n-x的差不等于x,那么l中存在两数之和等于n
3. 如果n-x的差等于x,那么l中至少存在两个x才能保证l中存在两数之和等于n
"""
if (n - x) in l and ((n != 2 * x) or (n == 2 * x and l.count(x) > 1)):
return True
return False
性能:
- 时间复杂度O(n^2)
- 空间复杂度O(n)
关键点:
- 判断n-x的差是否存在l中,如果n=2x,则判断l中x的数量应该大于等于2