LeetCode刷题--简单篇
1. 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
最容易想到的方法,两层循环,但是效率很低
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i+1, len(nums)): # 注意j是从i+1开始的,目的是不跟i相同
if nums[i] + nums[j] == target:
return [i, j]
nums = [3, 3]
target = 6
a = Solution() # 定义的类要初始化(或赋值),否则会出错
print(a.twoSum(nums, target))
结果:
[0, 1]
参考了别人的解法:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 生成一个字典,记录 值:下标 对应关系
dic = {}
for index, num in enumerate(nums):
dic[num] = index
# 和为target,该数在字典中为键,看是否存在
# 不存在则返回了None
# 存在就返回了该数在字典中的值,也就是下标,再判断下标是否与前一个数相同
for i, num in enumerate(nums):
j = dic.get(target-num)
if j is not None and i != j:
return [i, j]
测试:
nums = [3, 2, 4]
target = 6
a = Solution() # 定义的类要初始化(或赋值),否则会出错
print(a.twoSum(nums, target))
结果:
[1, 2]
后来自己想优化下,发现是错的,暂时没想到怎么解决下面的问题,错误方法如下:
for i in nums:
j = target - i
if j in nums and nums.index(i) != nums.index(j):
return [nums.index(i), nums.index(j)]
nums = [3, 3]
target = 6
a = Solution()
print(a.twoSum(nums, target))
最后结果取不到