1.题目描述(简单难度)
2.解法1(暴力枚举法)
思路:用两层for循环得到数组中所有两个数的组合,等于目标值即返回这两个数的下标
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int len = nums.size()
for(int i = 0;i < len;i++)
for(int j = i + 1;j < len;j++)
{
if(nums[i] + nums[j] == target)
return {i,j};
}
return {};
}
};
时间复杂度:两层for循环 O(n²)
空间复杂度:O(n)
解法2(哈希表)
思路:第一种方法的时间复杂度比较高的原因是使用了两层for循环,我们肯定会想能不能用一层for循环解决这个问题呢?
这个时候就要用到hashtable了,首先我们创建一个hashtable,键值分别为nums[i],i,遍历nums数组中的元素,如果在hashtable中存在target - nums[i],则返回查找到的下标和i,若不存在则把当前遍历到的nums[i]和i作为键值对添加到hashtable中,这样只需遍历一次就可以得到两个值为target的下标值了。
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int len = nums.size();
unordered_map <int,int> hashtable;
for(int i = 0;i < len;i++)
{
auto it = hashtable.find(target - nums[i]);
if(it != hashtable.end())
return {it->second,i};
hashtable[nums[i]] = i;
}
return {};
};
};
时间复杂度:一层for循环 O(n)
空间复杂度:创建hash表开销 O(n)
提示:这里用到了以空间换时间的思想