题目链接:two-num
思路一:两层for循环暴力求解,结果超时
1 def twoSum(nums,target):#使用二维数组
2 for i in range(len(nums)):
3 for j in np.arange(i+1,len(nums)):
4 if(nums[i] + nums[j] == target):
5 return [i,j]
思路二:考虑一层for循环,其他的靠python的内置函数解决。问题关键是求解target - num是否在list里面,在的话找到位置,要注意num1和num2是同一个元素的例外情况。
def twoSum(nums,target):
j = -1
for i in range(len(nums)):
if (target - nums[i]) in nums:
if(nums.count(target - nums[i]) == 1) & (target - nums[i] == nums[i]):
continue
else:
j = nums.index(target - nums[i],i+1)
break
if j > 0:
return [i,j]
else:
return []
思路三:解题思路是在方法一的基础上,优化解法。想着,num2 的查找并不需要每次从 nums 查找一遍,只需要从 num1 位置之前或之后查找即可。但为了方便 index 这里选择从 num1 位置之前查找
1 def twoSum2(nums,target):
2 j = -1
3 for i in range(1,len(nums)):
4 temp = nums[:i]
5 if (target - nums[i]) in temp:
6 j = nums.index(target - nums[i])
7 break
8 if j >= 0:
9 return [j,i]
思路四:通过哈希来求解,这里通过字典来模拟哈希查询的过程。
个人理解这种办法相较于方法一其实就是字典记录了 num1 和 num2 的值和位置,而省了再查找 num2 索引的步骤。
1 def twoSum3(nums,target):
2 hashmap = {}
3 for ind,num in enumerate(nums):
4 hashmap[num] = ind
5 for i,num in enumerate(nums):
6 j = hashmap.get(target - num)
7 if j is not None and j != i:
8 return [i,j]
思路五:类似方法三,不需要 mun2
不需要在整个 dict
中去查找。可以在 num1
之前的 dict
中查找,因此就只需要一次循环可解决。
1 def twoSum4(nums,target):
2 hashmap = {}
3 for ind,num in enumerate(nums):
4 if hashmap.get(target - num) is not None:
5 return [hashmap.get(target - num),ind]
6 hashmap[num] = ind
参考题解
一些python函数总结
python的count函数
python的index函数
&和&&的区别
Python 中 (&,|)和(and,or)之间的区别
Python enumerate() 函数
python的map函数
python的字典的使用
作者:你的雷哥
本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。