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;
    }
};
原文地址:https://www.cnblogs.com/qiulinzhang/p/12520609.html