题解的答案:
hashmap={}
for index,num in enumerate(nums):
another_num=target-num
if another_num in hashmap:
return[hashmap[index,another_num]]
hashmap[num]=index
return None
作者:smile-96
链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-pythonsan-chong-jie-fa-by-smile-9/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在pycharm运行的代码,为了便于理解加了print显示字典的内容。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
hashmap = {}
for index, num in enumerate(nums):
another_num = target - num
if another_num in hashmap:
return [hashmap[another_num], index]
hashmap[num] = index
print(hashmap)
return None
if __name__ == "__main__":
a = Solution()
print(a.twoSum([1, 2, 3, 4, 5, 5], 10))
如果把数组的内容替换为[2, 2, 2, 2, 5, 5], 则运行结果为:
因为键一般是唯一的,如果值重复,则最后的一个键值对会替换前面的,值不需要唯一。
比如:dict = {'a': 1, 'b': 2, 'b': '3'} print(dict)
的结果是{‘a’: 1, ‘b’: ‘3’}
总结:两次遍历同一个数组可以通过字典创建索引来解决。
C++解法:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;//提供一对一的hash
vector<int> b(2,-1);//用来承载结果,初始化一个大小为2,值为-1的容器b
for(int i=0;i<nums.size();i++)
{
if(a.count(target-nums[i])>0)//key为target-nums[i]的个数,要么为0,要么为1,为1则存在
{
b[0]=a[target-nums[i]];
b[1]=i;
break;
}
a[nums[i]]=i;//反过来放入map中,用来获取结果下标
}
return b;
};
};