Two Sum

作者: 默写年华Antifragile | 来源:发表于2020-03-18 21:50 被阅读0次

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;
    }
};

相关文章

网友评论

      本文标题:Two Sum

      本文链接:https://www.haomeiwen.com/subject/jrchyhtx.html