题目: 给定一个数组和一个目标值,找出和为目标值的两个元素,并且返回索引。
- 第一反应是可以暴力,就是复杂度为O(N^2),似乎不太好,时间复杂度太高。 就是简单的遍历数组两次得到答案。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0 ;i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums [j] == target) {
return {i,j};
}
}
}
return {};
}
};
第二种,则是用空间换时间,用一个哈希表去记录(对应的元素内容为key,索引为value),通过用哈希表去搜寻是否有target - map[num[i]]的元素,并返回索引,没有则把元素内容作为key,索引作为value进行存储。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//用一个数组存储返回的结果
vector<int>resultArr(2,-1);
map<int, int>a;
for (int i = 0; i < nums.size(); i++) {
if (a.count(target - nums[i]) > 0) {
resultArr[0] = a[target - nums[i]];
resultArr[1] = i;
}
a[nums[i]] = i;
}
return resultArr;
}
};