一、題目
中文:
二、代碼
1、暴力法
暴力法很簡單。遍歷每個元素。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n=nums.size();
vector<int> result;
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
int sum=nums[i]+nums[j];
if(sum==target){
result.push_back(i);
result.push_back(j);
break;
}
}
}
return result;
}
};
性能:
複雜度分析:
時間複雜度:O(n^2), 對於每個元素,我們試圖通過遍歷數組的其餘部分來尋找它所對應的目標元素,這將耗費 O(n)的時間。因此時間複雜度爲 O(n^2)。
空間複雜度:O(1)。
2、哈希表
用一個哈希表存儲每個數對應的下標。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> mapping;
vector<int> result;
for(int i=0;i<nums.size();i++){
mapping[nums[i]]=i;//用unordered_map先把數組中的數字和對應的下標存儲一遍,即數字作爲鍵,下標作爲值存儲。
}
for(int i=0;i<nums.size();i++){
const int gap=target-nums[i];//遍歷數組的時候用target-nums[i],得到差gap,然後在nordered_map中找是否存在gap,找到即返回gap所在的值,即所對應的數組的下標。
if(mapping.find(gap)!=mapping.end()&&mapping[gap]>i){
result.push_back(i);
result.push_back(mapping[gap]);
break;
}
}
return result;
}
};
性能:
複雜度分析:
時間複雜度:O(n)。
空間複雜度:O(n)。
三、知識點解析
1、map、hash_map、unordered_map的區別
http://www.cnblogs.com/ranjiewen/p/5328137.html
https://blog.csdn.net/zhc_24/article/details/78915968
2、mapping.find(gap)!=mapping.end()的解析
https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html
用find函數來定位數據出現位置,它返回的一個迭代器,當數據出現時,它返回數據所在位置的迭代器,如果map中沒有要查找的數據,它返回的迭代器等於end函數返回的迭代器。
查找map中是否包含某個關鍵字條目用find()方法,傳入的參數是要查找的key,在這裏需要提到的是begin()和end()兩個成員,
分別代表map對象中第一個條目和最後一個條目,這兩個數據的類型是iterator.