題目描述
給定一個整數(shù)數(shù)組 nums
和一個目標(biāo)值 target
,請你在該數(shù)組中找出和為目標(biāo)值的那 兩個 整數(shù),并返回他們的數(shù)組下標(biāo)。
你可以假設(shè)每種輸入只會對應(yīng)一個答案。但是,你不能重復(fù)利用這個數(shù)組中同樣的元素。
輸入示例:
nums=[2, 7, 11, 15]
target=9
輸出:
[0, 1]
思路解讀
題目不難理解,給定的輸入是一個數(shù)組nums
和整數(shù)target
,需要找到nums[i]+nums[j]==target
,并返回i
, j
假設(shè)的含義是,當(dāng)你找到了這樣一組i
,j
時,可以立即返回,同時要注意返回的索引值不能相同。
解法一:暴力循環(huán)
這個解法應(yīng)該是像我這樣的菜雞能想到的第一個方法。兩個循環(huán)嵌套,第一個循環(huán)遍歷數(shù)組,每次取出的元素假設(shè)叫x
,第二個循環(huán)則是遍歷數(shù)組剩余部分,查找是否存在target-x
這個元素。
顯然,這個解法的時間復(fù)雜度是,空間復(fù)雜度是
#include <iostream>
#include <vector>
using namespace std;
class Solution{
public:
//暴力解法
vector<int> twoSum(vector<int> &nums, int target){
vector<int> idx;
vector<int>::iterator i = nums.begin();
while(i != nums.end()-1)
{
vector<int>::iterator j = i+1;
while(j!=nums.end())
{
if(*i + *j==target)
{
idx.push_back(i-nums.begin());
idx.push_back(j-nums.begin());
return idx;
}
j++;
}
i++;
}
return idx;
}
};
這個方法比較簡單,不再用注釋解釋思路。雖然思路比較簡單,由于題目要求用stl求解,第一次接觸還是花了很久,這里說一下需要注意的點:
- 使用vector時,要引入<vector> 并且使用標(biāo)準(zhǔn)命名空間
- 遍歷vector需要用迭代器,vector.begin()表示vector的首端,.end()表示尾端
- 迭代器變量
i
可以當(dāng)成指針,用i++
就可以進(jìn)入下一輪循環(huán),用*i
來訪問元素 - 返回索引時不能直接返回
i
,因為他不是int類型的對象,不能push到vector中,要用i-nums.begin()
解法二: 一遍哈希表法
在遍歷數(shù)組時,可以一邊將元素存入哈希表,一邊從已存入的值中查找目標(biāo)解。
#include <iostream>
#include <vector>
#include <map>
using namespace std;
class Solution{
public:
//一遍map解法
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> map;
for(int i=0; i<nums.size(); i++){
int x = target - nums[i];//x是目標(biāo)值
//在這里數(shù)組的元素是map的key,數(shù)組的下標(biāo)才是map的value
//find(x)是查找是否有key==x,并返回以key開始的迭代器
//如果想要得到value,則需訪問second成員
if(map.find(x)!=map.end())
return {map.find(x)->second, i};
map[nums[i]]=i;
}
return{};
}
};
時間復(fù)雜度:,因為只遍歷了數(shù)組一次,且find()函數(shù)只需
的時間。
空間復(fù)雜度:,因為需要用map來存儲數(shù)組元素。