完整代碼如下
- 使用Hash表(時間複雜度爲O(1),但是需要建立Hash表,以空間換時間!)
有兩種使用Hash表的方法,第一種爲:
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
class Solution
{
public:
Solution(){};
~Solution(){};
vector<int> twoSum(vector<int> &numbers, int target){
unordered_map<int, int> hash;
vector<int> result;
for (int i=0; i<numbers.size(); i++){
int numberTofind = target - numbers[i];
if (hash.find(numberTofind)!=hash.end()){
result.push_back(hash[numberTofind]);
result.push_back(i);
return result;
}
hash[numbers[i]]=i;
}
return result;
}
};
第二種爲:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> num_map;
vector<int> res;
for (int i = 0; i < nums.size(); i++) {
num_map[nums[i]] = i;
}
for (int i = 0; i < nums.size(); i++) {
int tmp = target - nums[i];
if (num_map.find(tmp) != num_map.end() && num_map[tmp] != i){
res.push_back(i);
res.push_back(num_map[tmp]);
break;
}
}
return res;
}
};
其實觀察上面兩種實現,有一個小細節是兩者的if判斷條件不同,第二種的if
加了一個&& num_map[tmp] != i
。原因是因爲第一種在初次遍歷的同時建立hash表(只要未掉入if
語句塊),所以不存在num_map[tmp] != i
的情形。而第二種方法就是很蠻力地做了兩次遍歷,初次遍歷只用於建立hash表,所以第二次遍歷的時候if就要考慮num_map[tmp]
是否爲i
了。總的來看,第一種更快更好!
下面是測試代碼:
int main(int argc, char const *argv[])
{
Solution s;
int a[4] = {2,7,11,15};
vector<int> v(a,a+4);
vector<int> w;
w = s.twoSum(v,9);
// for (int i=0; i < sizeof(a)/sizeof(int); i++)
// {
// cout<<a[i]<<endl;
// }
cout<<"The indices of are:";
for (int i=0; i<w.size(); i++)
{
cout<<w[i]<<" ";
}
return 0;
}
收穫主要是:
1. 學會了vector的一個遍歷方式,利用numbers.size();vector的一種用數組的初始化方法
2. 學習到unordered_map,unordered_map和map類似,都是存儲的key-value的值,可以通過key快速索引到value。不同的是unordered_map不會根據key的大小進行排序。