题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
开始思路:
只是做出来,但是没有考虑只对应一个答案,两个for循环不容易解决重复问题,
1 a = [2,4,6,3] 2 b = 9 3 def twoSum(nums, target): 4 lens = len(nums) 5 for i in range(lens): 6 for j in range(i+1,lens): 7 if nums[i]+nums[j] == target: 8 print(i, j) 9 break 10 break
这样在列表的第一个第二个值重复时候会出错
改正思路:只循环一个j,和值减去当前循环值去寻找差值,得到唯一性:
1 a = [2,4,6,3] 2 b = 9 3 def twoSum(nums, target): 4 lens = len(nums) 5 for i in range(1, len(nums)): 6 temp = nums[:i] 7 if (target - nums[i]) in temp: 8 j = temp.index(target - nums[i]) 9 print(j, i) 10 11 12 twoSum(a, b)
需要学习注意的是:
range 的范围是从0到i-1
列表的下标范围是从0开始对应元素
a[:1]表示a[0],列表的第一个元素
进一步学习:
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
enumerate(sequence, [start=0])
- sequence — 一个序列、迭代器或其他支持迭代对象。
- start — 下标起始位置。
1 def two_sum(nums, target): 2 """这样写更直观,遍历列表同时查字典""" 3 dct = {} 4 for i, n in enumerate(nums): 5 #nums自动识别为字典,nums中下标为键,值为列表对应值 6 cp = target - n 7 #寻找和减去第一个的数的差值 8 if cp in dct: 9 print([dct[cp], i]) 10 else: 11 dct[n] = i 12 #返回的一种写法 13 14 15 two_sum(a, b)
引申算法:哈希算法
1 用字典模拟哈希求解 2 字典记录num1和num2的值和位置 3 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 4 def twoSum(nums, target): 5 hashmap={} 6 #存储的内容是键值对(key-value)映射 7 for ind,num in enumerate(nums): 8 hashmap[num] = ind 9 for i,num in enumerate(nums): 10 j = hashmap.get(target - num) 11 if j is not None and i!=j: 12 return [i,j]
最后两个引用出处
作者:lao-la-rou-yue-jiao-yue-xiang
链接:https://leetcode-cn.com/problems/two-sum/solution/xiao-bai-pythonji-chong-jie-fa-by-lao-la-rou-yue-j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2771.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...