题目:
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].
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
vector<int> result;
for (int i = 0; i < nums.size(); i++) {
int num_find = target - nums[i];
if (hash.count(num_find) != 0) {
result.push_back(hash[num_find]);
result.push_back(i);
return result;
}
hash[nums[i]] = i;
}
return result;
}
};
思路:
一开始我设计的算法是两个for循环,对nums中的每一个元素与其他元素相加,看结果是否等于target。这当然是最容易想到的方法,但是这个方法的复杂度为O(n^2),开销太大,是个很差劲的算法。
当然我之后又做了一些改进,但基本还是绕着n^2打转,没太大的变化。上面代码中的算法是我目前找到最好的。它用了unordered_map容器,将nums中元素的值和元素下标存入hash中,对nums中每个元素与target做减法,查找目标的number是否在hash中,若在,则输出成result;若不在,则继续循环。
这个算法极大地降低了的复杂度,直接从O(n^2)降到O(n),确实值得学习。
补充知识:
1.使用unordered_map查找元素是否存在的方法:
若有unordered_map<int, int> mp;查找x是否在map中
方法1:若存在 mp.find(x) != mp.end()
方法2:若存在 mp.count(x) = 0
2.vetor.push_back 在数组的最后添加一个数据
参考文章:
c++中vector的用法详解
unordered_map的用法