題目描述
給定一個整數數組 nums
和一個目標值 target
,請你在該數組中找出和為目標值的那 兩個 整數,并返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重復利用這個數組中同樣的元素。
輸入示例:
nums=[2, 7, 11, 15]
target=9
輸出:
[0, 1]
思路解讀
題目不難理解,給定的輸入是一個數組nums
和整數target
,需要找到nums[i]+nums[j]==target
,并返回i
, j
假設的含義是,當你找到了這樣一組i
,j
時,可以立即返回,同時要注意返回的索引值不能相同。
解法一:暴力循環
這個解法應該是像我這樣的菜雞能想到的第一個方法。兩個循環嵌套,第一個循環遍歷數組,每次取出的元素假設叫x
,第二個循環則是遍歷數組剩余部分,查找是否存在target-x
這個元素。
顯然,這個解法的時間復雜度是,空間復雜度是
#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> 并且使用標準命名空間
- 遍歷vector需要用迭代器,vector.begin()表示vector的首端,.end()表示尾端
- 迭代器變量
i
可以當成指針,用i++
就可以進入下一輪循環,用*i
來訪問元素 - 返回索引時不能直接返回
i
,因為他不是int類型的對象,不能push到vector中,要用i-nums.begin()
解法二: 一遍哈希表法
在遍歷數組時,可以一邊將元素存入哈希表,一邊從已存入的值中查找目標解。
#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是目標值
//在這里數組的元素是map的key,數組的下標才是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{};
}
};
時間復雜度:,因為只遍歷了數組一次,且find()函數只需
的時間。
空間復雜度:,因為需要用map來存儲數組元素。