输入:nums = [2, 7, 11, 15],target = 9
输出:[0, 1]
题意:从nums中找出两个元素,它们的和等于target,然后返回它们的下标
1、暴力法
写嵌套循环,让每一个元素和其他元素分别相加,判断和是否等于target,等于就返回下标。
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 {};
}
};
2、使用find方法
遍历nums的每一个元素,用find方法从剩下的元素中找匹配的加数,找到就返回下标。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
// 遍历nums
for(int i=0; i<nums.size(); i++){
// 寻找另一个数
auto it = find(nums.begin()+i+1, nums.end(), target-nums[i]);
// 如果找到另一个数
if(it != nums.end()){
// 迭代器转化为下标
int other = it-nums.begin();
return {i, other};
}
}
return {};
}
};
3、使用unordered_map,即哈希表
遍历nums的每一个元素,从哈希表中找匹配的加数,找到则返回下标,找不到就存入哈希表。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
// 声明无序哈希容器
unordered_map<int, int> hash;
// 遍历nums
for(int i=0; i<nums.size(); i++){
// 在哈希表中寻找另一个数
auto it = hash.find(target-nums[i]);
// 如果找到另一个数
if(it != hash.end()){
return {i, it->second};
}
// 如果没找到,将当前遍历元素存入哈希表
hash[nums[i]] = i;
}
return {};
}
};
注意:
1、vector的初始化方法,举例:vector<int> nums{1, 2, 3}。
2、迭代器转下标的语法,举例:int index = it - nums.begin()。
3、向量的find方法的时间复杂度为O(n),哈希表的find方法的时间复杂度为O(1)。因为哈希表在查找的时候是通过内部的哈希函数进行计算的,不像向量的find是单纯地遍历元素。