题目链接:https://leetcode.cn/problems/two-sum/
方法一
方法一是最简单了,也是最容易想到的,既然给一个目标值再给一堆数字,那么我们就使用暴力枚举的方式,一个个试到底是哪两个数的和为目标值,如果找到了直接return就好了
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> ans;for (int i = 0; i < nums.size(); ++i){for (int k = i + 1; k < nums.size(); ++k){if (nums[i] + nums[k] == target){ans.push_back(i);ans.push_back(k);return ans;}}}return ans;}
};
时间复杂度方面,外层循环会执行n次(n为数组长度),而内层循环会从k = i + 1执行到n,随着i增加,内层循环次数减少,但平均来说,内存循环执行次数约为n/2,因此整个算法的时间复杂度为双重循环的成绩,则为O(n ^ 2)
空间复杂度方面,结果ans固定返回长度为2的数组,不随着输入规模而变化,因此复杂度为O(1)
方法二
方式二我们可以通过哈希表来实现,我们每次在循环的时候先计算target - x[i],判断哈希表中是否有这个值,如果存在这个值则返回其索引即可,这样的实现复杂度由于只需要对每个数访问一次,最坏的情况下时间复杂度是O(N)
class Solution
{
public:vector<int> twoSum(vector<int>& nums, int target){// mapunordered_map<int, int> map;// 遍历每一个元素for (int i = 0; i < nums.size(); ++i){// 通过map查找有没有bauto m = map.find(target - nums[i]);// 如果返回的不是end则代表找到了if (m != map.end()){return {m->second, i};}map[nums[i]] = i;}}
};
空间复杂度方面,由于我们使用map来存储中间数,在最坏的情况下可能存储n个,因此空间复杂度为O(N)