【LeeCode简单_C++】1、两数之和(vector)

【LeeCode简单_C++】1、两数之和(vector)_第1张图片

 暴力法

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)
class Solution
{
public:
    vector twoSum(vector& nums, int target)
    {
        vector twoSum;

        for(int i=0;i

两遍哈希表(空间换时间)

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

 

  • 第一遍哈希表:保持数组中的每个元素与其索引相互对应。

通过以空间换取速度的方式,将查找时间从 O(n) 降低到 O(1)。哈希表正是为此目的而构建的,它支持以 近似 恒定的时间进行快速查找。我用“近似”来描述,是因为一旦出现冲突,查找用时可能会退化到 O(n)。但只要你仔细地挑选哈希函数,在哈希表中进行查找的用时应当被摊销为 O(1)。

  • 第二遍哈希表:检查每个元素所对应的目标元素(target - nums[i])是否存在于表中。
class Solution
{
public:
    vector twoSum(vector& nums, int target)
    {
        vector twoSum;

        map tmpmap;    
        for (int i = 0; i < nums.size(); i++) 
        {
            tmpmap[nums[i]] = i;//tmpmap[键值] = 下标顺序
        }

        for (int i = 0; i < nums.size(); i++)
        {
            //如果存在对应值 且 其对应值的下标不是他自己
            if (tmpmap.count(target - nums[i]) == 1 
                && tmpmap[target-nums[i]]!=i) 
            {
                twoSum.push_back(i);
                twoSum.push_back(tmpmap[target - nums[i]]);
                break;
            }
        }
        return twoSum;
    }
};

一遍哈希表(边判断边加入)

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
class Solution
{
public:
    vector twoSum(vector& nums, int target)
    {
        vector twoSum;
        map tmpmap;
        for(int i = 0;i < nums.size();i++)
        {
            if(tmpmap.count(target - nums[i]) == 1)
            {
                twoSum.push_back(tmpmap[target - nums[i]]);
                twoSum.push_back(i);
                break;
            }
            tmpmap[nums[i]] = i;
        }
        return twoSum;
    }
};

 

你可能感兴趣的:(c++,LeeCode)