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.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
方法一是使用暴力求解,時間複雜度爲n^2,當數據很大時,效率很低
方法二是先排序再判斷,時間複雜度是nlgn。開始用快排,或其他排序方法對nums排序,然後用兩個指針從前後開始進行判斷,然後從i=0,j=end開始和末位的兩個數字開始,計算兩個之和sum,若sum大於目標值target,則需要一個較小的因子,j–;反之,i++;直至找到最終的結果。
這裏沒有返回標號
方法三是用哈希,時間複雜度是o(n). 哈希表在理想的情況下查找一個數是O(1),新的c++11中增加了unordered_map;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>res(2,-1);
unordered_map<int,int>m;
for(int i=0;i<nums.size();i++){
int t=target-nums[i];
if(m.find(t)==m.end()){
m[nums[i]]=i;
}else{
res[0]=m[t];
res[1]=i;
break;
}
}
return res;
}
};
如果使用stl中的map,則時間複雜度是nlgn, stl中的map容器的底層實現是紅黑樹,查找find需要的時間是lgn,外層遍歷是n。