【python】【2sum】6/17/2020

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的时候清楚的知道用字典可以帮我省时间复杂度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值