题目描述:
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.
解法1:
使用最简单的解法,将数组中的数字两两相加,检验数字是否等于目标数字。这样的计算复杂度是
O(n2)
,而空间复杂度仅为
O(1)
。最后用时122 ms。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> results;
int length = nums.size();
for(int i = 0;i < length - 1;i++){
for(int j = i + 1;j < length;j++){
if(nums[i] + nums[j] == target){
results.push_back(i);
results.push_back(j);
return results;
}
}
}
return results;
}
};
解法2:
这是一种时间复杂度为
O(n)
的解法。如果不想重复遍历数组中的数字,那就可以考虑将数组中的数字和序号一一对应进行存储,而最容易完成这项任务的数据结构就是使用hash表。C++中对应于hash表的数据类型是unordered_map
。最后提交时所用时间大大减少,仅用时6ms。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash_map;
vector<int> results;
for(int i = 0; i < nums.size(); i++){
int num_to_find = target - nums[i];
if(hash_map.find(num_to_find) != hash_map.end()){
results.push_back(hash_map[num_to_find]);
results.push_back(i);
return results;
}
hash_map[nums[i]] = i;
}
return results;
}
};