【初级算法】两数之和 2021.8.11

【题目】两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]
 

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2jrse/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

1.0 自己做

 1 class Solution(object):
 2     def twoSum(self, nums, target):
 3         """
 4         :type nums: List[int]
 5         :type target: int
 6         :rtype: List[int]
 7         """
 8         length_nums = len(nums)
 9         for i in range(length_nums):
10             numss = nums[:]
11             remainder = target - nums[i]
12             del numss[i]
13             if remainder in numss:
14                 j = numss.index(remainder)
15                 ret = [i, j+1]
16                 return ret

 

 

 虽然做出来很高兴,但看看结果,感觉自己果然还很菜......

思路:开始想用前两天的方法一个一个遍历,但想想果然还是应该用些简单的方法。于是就想依次从nums中提取元素,再计算 target-该元素=得到的值,在nums中是否能找到,能找到就提取出索引return。

又学习到了:

① del temp[i]  用del删除列表中的值
https://www.cnblogs.com/hanmk/p/13799062.html

② l1.index(1) 查找列表某值对应的索引
https://blog.csdn.net/xidianbaby/article/details/88712235

③ nums2=nums1[:] 将一个列表的值复制到另一个列表备用,互不影响
https://blog.csdn.net/weixin_43249038/article/details/107947532

体会总结:在前面的一段代码中本来加入了  if numss[i] <= target: 

来判断数的大小,后来发现原来nums中和target的值都可以为负为正,如果加上这句话就还需要添加上更多的句子来判断正负,不如直接去掉的好。

 这一次比之前的思路更加灵活了,自己有意识地在寻找更加便利的方法,虽然还是不太便利,但相比之前有很大的进步。

 这段代码从构思到写完,我感觉思路顺畅了许多,没有那么艰难了,可能也更快了(?),没有计时。就酱。

 

 

2.0 两数之和简化算法(8.12)

两数之和的常规算法是嵌套循环,用两个for循环遍历两次列表,这种方法就不写了。

简化算法的思路和我的一样都是相减,但是在手段、细节上比我的方法要好很多,并且只简化到了四行代码。

1 class Solution:
2     def twoSum(self, nums: List[int], target: int) -> List[int]:
3         for i in range(len(nums) - 1):
4             if target - nums[i] in nums[i+1:]:
5                 j = nums[i+1:].index(target - nums[i])
6                 return [i, i + j + 1]

 

 计算j的索引时,不直接取是为了防止两数相同的情况

 

 

2.1 力扣上看到的方法1

挺有趣的,来学习一下

 

 

 

 1 class Solution:
 2     def twoSum(self, nums, target):
 3         dict_num = dict()
 4         for i, v in enumerate(nums):
 5             tmp = target - v
 6             if dict_num.get(tmp) is not None:
 7                 return i, dict_num[tmp]
 8             else:
 9                 dict_num[v] = i
10         return 0, 0

enumerate()函数,python内置函数

描述:

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中

Python 2.3. 以上版本可用,2.6 添加 start 参数。

 

 

 输出:从start开始的数字和对应的值。start默认为0.

 

 

 

 

 

 思考:enumerate和字典的结合使用。值与索引保存在字典中,判断减去的值是否在字典已有的数中,若有则输出两数索引;若无则添加到字典里。空间换时间。

 

posted @ 2021-08-11 10:02  阿吽  阅读(61)  评论(0)    收藏  举报