写在前边:
本人编程小白自此开启leetcode刷题之旅,计划每日一题。
第一遍会尝试自己动手写,同时输出博客,第二刷的时候会按照博客里的后续优化继续输出代码。任何问题请大家批评指正。
时间:2020-5-09
题目地址:https://leetcode-cn.com/problems/two-sum/
题目难度:Easy
题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路:暴力破解
代码段1:解答错误
输入:
[3,3] 6
输出
[0,0,0,0]
预期结果
[0,1]
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
result = []
for i in nums:
if i > target:
continue
else:
temp = nums.index(i)
for j in nums[temp + 1:]:
if i + j == target:
r1 = nums.index(i)
r2 = nums.index(j)
result.append(r1)
result.append(r2)
return result
原因:存在相同的元素,r2的索引位置错误
修复:修改r2,同时修改测试用例,执行代码通过
代码段2:解答错误
输入:
[3,2,4] 6
输出
[1,1]
预期结果
[1,2]
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
result = []
for i in nums:
if i > target:
continue
else:
temp = nums.index(i) + 1
for j in nums[temp:]:
if i + j == target:
r1 = nums.index(i)
r2 = nums[temp:].index(j) + 1
result.append(r1)
result.append(r2)
return result
原因:对于r1不是0的,r2的索引位置错误
修复:修改r2,同时修改测试用例,执行代码通过
代码段3: 解答错误
[-1,-2,-3,-4,-5] -8
输出
[]
差别
预期结果
[2,4]
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
result = []
for i in nums:
if i > target:
continue
else:
temp = nums.index(i) + 1
for j in nums[temp:]:
if i + j == target:
r1 = nums.index(i)
r2 = nums[temp:].index(j) + 1 + r1
result.append(r1)
result.append(r2)
return result
原因:对于一开始的if判断多余了,没有考虑输入为负数的场景
修复:去掉if判断
代码段4:通过
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
result = []
for i in nums:
temp = nums.index(i) + 1
for j in nums[temp:]:
if i + j == target:
r1 = nums.index(i)
r2 = nums[temp:].index(j) + 1 + r1
result.append(r1)
result.append(r2)
return result
结果:通过
总结:第一次用leetcode刷题,不太熟悉套路,应当对自己的代码输出多找几个测试case
思路4:使用set
代码段4:通过
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(0, len(nums)):
set1 = nums[i+1:]
_temp = target - nums[i]
if(_temp in set1):
return([i, nums[i+1:].index(_temp) + i + 1])
总结:
思路5:使用哈希表dict
代码段5:通过
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dict1 = {}
for i, element in enumerate(nums):
dict1[element] = i
for j, element in enumerate(nums):
temp = dict1.get(target - element)
if temp != j and temp is not None:
return [j, temp]
总结:
思路6:使用哈希表dict,但是在element之前找,省去了循环、重复和target-num=num的判断
代码段6:通过
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dict1 = {}
for i, element in enumerate(nums):
if dict1.get(target - element) is not None:
return [dict1.get(target - element), i]
dict1[element] = i
总结: