1.暴力解法
时间复杂度O(N),空间复杂度O(
N
2
N^2
N2)
class Solution {
public:
/**
*
* @param numbers int整型vector
* @param target int整型
* @return int整型vector
*/
vector<int> twoSum(vector<int>& numbers, int target) {
// write code here
vector<int> result;//用push back去在末尾增加值
for(int i=0;i<numbers.size()-1;i++){
for(int j=i+1;j<numbers.size();j++){
if(numbers[j]+numbers[i]==target){
result.push_back(i+1);
result.push_back(j+1);
return result;
}
}
}
return result;
}
};
暴力解法过不了,只能过7/12的用例。
2.根据提示,使用hash表解法
Hash表本质上是一种以空间换时间的方法
Hash表设计为<值,下表>的格式,方便使用find函数
- 只需要遍历一次数组,时间复杂度O(N)
- 由于下面的循环写法,find找到的值的下标肯定在当前遍历到的下标i的前面,所以无需比较下标大小
class Solution {
public:
/**
*
* @param numbers int整型vector
* @param target int整型
* @return int整型vector
*/
vector<int> twoSum(vector<int>& numbers, int target) {
int n = numbers.size();
vector <int> res;
if (!n)
return res;
// 定义哈希表,unordered_map是用哈希表实现的,复杂度为O(1),而map是用红黑树实现的
unordered_map<int, int> hashmap;
for (int i = 0; i < n; i ++) {
if (hashmap.find(target - numbers[i]) != hashmap.end()) { // find函数返回hashmap.end()代表未找到,否则代表找到
// 将结果存入数组
res.push_back(hashmap[target - numbers[i]] + 1);
res.push_back(i + 1);
break;
} else {
hashmap[numbers[i]] = i; // 将未找到的值插入哈希表中,继续遍历
}
}
return res;
}
};