Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice.
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
刚开始我的理解就是从这组数组里找到比9小的数字,放到新的数组里,然后用两个loop去数组找到nums[j]+nums[k] == target 的方式最后返回[j, k]。可是直接从元数组里就可以直接loop啊干嘛非得放到新的数组里还占空间。然后我就写成了这个样子:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
less = []
for i in nums:
if i < target:
less.append(i)
for j in range(0,len(less)-1):
for k in range(j+1,len(less)):
if nums[k] + nums[j] == target:
return [j,k]
这种写法如果当target是0,input是[0,4,3,0]的时候就会报错。我没有考虑到边界条件,当input中如果有负数的情况我这一步就没有意义了。一正数加一负数或许也可以得到target。
正确暴力解法
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for j in range(0,len(nums)-1):
for k in range(j+1,len(nums)):
if nums[k] + nums[j] == target:
return [j,k]
len(nums)-1的原因是为了不越界,因为k是从j+1开始的。
这种两个for loop的时间复杂度是O(n^2),run出来后长这个样子:
使用字典
为了更快于是决定使用字典来提高,用字典的好处就是快,但是费空间。 每一次存key存与target的差值,value保存indice。当i已经存在在字典里,直接返回字典里的index与当前index。
时间复杂度是O(n)。
代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
res = {}
for i in range(len(nums)):
if nums[i] in res:
return [i, res[nums[i]]]
res[target - nums[i] = i
return []
run完长这个样子:
自我总结
我觉得我没有想到用字典的重要原因是我对与字典的优缺点了解的不是很清楚,对于什么样的数据结构能帮我解决什么样的问题我也不清楚。所以导致我的思路很单纯,也很容易因为边界条件没有考虑到而出错。在之后的刷题中我希望自己可以保持清醒,对于每一个if条件在写到时都会去考虑是否安全;看到返回值是indice的时候清楚的知道用字典可以帮我省时间复杂度。