1、Two Sum
问题描述:
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.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
分析:
找出数组numbers中的两个数,它们的和为给定的一个数target,并返回这两个数的索引,比如numbers={2,7,11,17}; target=9。那么返回一个元组(0,1)。
这道题不需要去重,对于每一个target输入,只有一组解,索引要按照大小顺序排列。
解决方法:
hash方法,用一个哈希表,存储每个数对应的下标。时间复杂度O(n),空间复杂度O(n)
C++实现
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ret;
if (nums.size() <= 1){
return ret;
}
unordered_map<int,int> myMap;
for (int i = 0;i < nums.size();++ i)
myMap[nums[i]] = i;
for(int i = 0;i < nums.size();++i){
int rest_val = target - nums[i];
if(myMap.find(rest_val) != myMap.end()){
int index = myMap[rest_val];
if(index == i)
continue;
if(index < i){
ret.push_back(index);
ret.push_back(i);
return ret;
}
else{
ret.push_back(i);
ret.push_back(index);
return ret;
}
}
}
}
};
知识点:
1、unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是unordered_map不会根据key的大小进行排序,
存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。
python实现
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
d = {}
for i in xrange(0, len(nums)):
if target - nums[i] in d:
return d[target - nums[i]], i
if nums[i] not in d:
d[nums[i]] = i