目录
暴力法
set()集合法,看过即存
字典法dict(),看过即存
暴力法
笑死我了,这题两层循环居然没超时
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n=len(nums)
for i in range(n):
for j in range(n):
if j!=i and nums[j]+nums[i]==target:
return[i,j]
悲壮;噢原来我这个叫暴力法
事实上,我把j从i+1开始,少一半枚举量,但还是很高
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n=len(nums)
for i in range(n):
for j in range(i+1,n):
if nums[j]+nums[i]==target:
return[i,j]
set()集合法,看过即存
来个set方法,现学现用
简单来说就是建立一个seen集合,存储我们目前见过的数字,然后遇到刚好差的那个数,返回下标即可(不是,这玩意不也是两层循环吗?)
噢,6
集合的查找操作的时间复杂度是平均O(1)的,而列表的查找操作的时间复杂度是O(n)。因此,如果seen
是一个集合,那么if complement in seen:
的时间复杂度是O(1);如果seen
是一个列表,那么时间复杂度是O(n),其中n是seen
列表的长度。
而且set()的添加方式是set.add(),还会自动添加下标
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
seen=set()
for i,num in enumerate(nums):
toset=target-num
if toset in seen:
return [i,nums.index(toset)]
#存进去还会自动记录下标
seen.add(num)
确实有实力
字典法dict(),看过即存
建立字典dict(),存储方式和set()些许不同
dict[键]=值,复杂度感觉和上面那个set()差不多
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
record=dict()
for i,num in enumerate(nums):
toset=target-num
if toset in record:
return [record[toset],i]
record[num]=i
还快一丢丢
因此,相比暴力,set()集合与dict()字典都能迅速在O(1)内查找元素及其下标。
参考链接