Two Sum
https://leetcode.com/problems/two-sum/
给定一个数组a, 一个数 T,问数组 a 中是否存在两个数之和等于 T,如果有则返回这两个数的下标
1. 最简单的方法
从第一个数开始逐一与后面的数相比,判断两个数的和是否等于T;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int>sum;
int i=0,j=0;
for(i=0;i<nums.size();i++)
for(j=i+1;j<nums.size();j++)
if(nums[i]+nums[j]==target)
{
sum.push_back(i);
sum.push_back(j);
return sum;
}
}
};
1.1 分析:
从第一个数开始,每个数逐一与后面的数进行比较,每次需要比较 n-1 次,总共有 n 个数,因此时间复杂度为 \(O(n^2)\),而且这里不需要额外的空间存储,仅需要一个作为下标返回的vector,因此空间复杂度为 \(O(1)\);
2. 利用哈希表
哈希表具有 O(1) 的查找复杂度,可以将总体的时间复杂度从 \(O(n^2)\)降低到\(O(n)\),但是需要一个\(O(n)\)的空间来存储哈希表;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
vector<int> result;
for (int i = 0; i < nums.size(); ++i)
{
if (hash.count(target-nums[i]))
{
result.push_back(hash[target-nums[i]]);
result.push_back(i);
return result;
}
hash[nums[i]]=i;
}
return result;
}
};