leetcode1:两数之和 python3解法
程序员文章站
2022-07-14 17:28:26
...
题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
作答:
方法1:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n = len(nums)
for i in range(n): # 0~n-1
y = target-nums[i]
if y in nums:
if (nums.count(y) == 1) and (y == nums[i]): #避免同一个元素用两次,比如2+2=4
continue
else:
return i, nums.index(y, i+1) #在i之后寻找y的索引值
执行用时:1040ms,内存消耗:14.6MB
方法2:来自方法1的改编,使用切片
def twoSum(nums, target):
for i in range(len(nums)):
temp_list = nums[:i] #为什么不能是[(i+1):],因为i是最后一个就不行哒
y = target - nums[i]
if y in temp_list:
return temp_list.index(y),i
执行用时:444ms,内存消耗:14.7MB
方法3:使用字典模拟哈希。
利用字典,遍历列表中的元素时,将每个元素需要的值(target-num[i])作为key,当前元素的下标i存入字典中,理解为第i个元素需要的值在字典中,此后的遍历先看当前的元素是否在字典中被需要。是,则返回需要元素的下标和当前元素的下标。否则,将target-num[i]:i存入字典中
def twoSum(nums, target):
hash = {} #定义一个字典
for i in range(len(nums)):
y = target - nums[i]
if nums[i] in hash: #如果当前元素在字典的key中,即被需
return hash[nums[i]], i
else:
hash[y] = i #将当前元素所需要的值和当前元素的下标存入字典中
执行用时:60ms,内存消耗:15MB
提交成功,但是测试会存在问题的一种方法
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n = len(nums)
for i in range(n):
y = target-nums[i]
if y in nums and nums.index(y) != i:
return i, nums.index(y)
测试用例:
[3,3] 6
返回:[1,0]
预期:[0,1]
这种方法是方法1的原型。
使用字典的方法3,是我目前万万想不到的,看了大佬们的解法,我还想了一会儿,哎。
python也是才学,这次的题让我意思到python的列表我还有很多需要解决的问题,所以在逐步整理列表的知识。有需要可以看一看。
上一篇: LeetCode1 两数之和(C++)
下一篇: Java学习Day4