题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解答:
最简单的暴力解法:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> v;
for(int i = 0; i < nums.size() - 1; i++) {
for(int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
v.push_back(i);
v.push_back(j);
return v;
}
}
}
return v;
}
};
利用map容器来进行查找:
map解法 O(N*logN):
从 0 到 n - 1 依次遍历,利用map存放每一个数值的下标,在map中寻找是否有使(nums[i] + x == target)成立的x的存在,如果存在则返回i和它的下标(即myMap[ target - nums[i] ])。
复杂度分析:因为只遍历了一次数组,map每次的查询的时间复杂度为O(logN)所以整体复杂度为O(N*logN)、这里使用hash_map可以将查询复杂度降低到O(1),从而使得整体复杂度为O(N),在C++11中hasp_map为unordered_map。
首先要搞清楚map的键和值存放什么。map的键存放nums[i],值存放i。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>myMap;
vector<int> result;
for(int i = 0; i < nums.size(); i++) {
if(myMap.find(target - nums[i]) == myMap.end()) {
myMap[nums[i]] = i;
} else {
result = {myMap[target - nums[i]], i};
}
}
return result;
}
};