【初级算法】两数之和 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和字典的结合使用。值与索引保存在字典中,判断减去的值是否在字典已有的数中,若有则输出两数索引;若无则添加到字典里。空间换时间。


浙公网安备 33010602011771号