给定一个整数数组,找到两个数字,使它们加起来一个特定的目标数

时间:2014-05-19 00:23:40

标签: c++ algorithm

所以我试图解决从数组中找到两个数字的问题,以便它们加起来一个特定的目标数。 解决它的最简单方法(它给出TimeLimit错误,因为它需要O(n ^ 2)时间)

vector<int> res, temp = numbers;
sort(temp.begin(), temp.end());
for (int i = 0; i < numbers.size(); i++)
{
    for (int j = i + 1; j < numbers.size(); j++)
    {
        if (numbers[i] + numbers[j] == target)
        {
            res.push_back(i + 1);
            res.push_back(j + 1);
            return res;
        }
    }
}

此外,我已经尝试在查找之前对数组进行排序,然后使用两个指针(现在它需要O(n ^ 2 log n)时间,但仍然给出了时间限制错误)

vector<int> twoSum(vector<int> &numbers, int target) {
    vector<int> res, temp = numbers;
    sort(temp.begin(), temp.end());
    int i = 0, j = numbers.size() - 1;
    while (i < j)
    {
        if (temp[i] + temp[j] == target)
        {
            res.push_back(i);
            res.push_back(j);
            break;
        }
        if (temp[i] + temp[j] < target)
            i++;
        if (temp[i] + temp[j] > target)
            j--;
    }
    for (int i = 0; i < numbers.size(); i++)
    {
        if (numbers[i] == temp[res[0]])
        {
            res[0] = i + 1;
            break;
        }
    }
    for (int i = 0; i < numbers.size(); i++)
    {
        if (numbers[i] == temp[res[1]])
        {
            res[1] = i + 1;
            break;
        }
    }
    return res;
}

所以我想知道如何仅使用O(n)时间来解决这个问题? 我听说过有关哈希和地图的事情,但不知道它们是什么以及如何使用它们。

1 个答案:

答案 0 :(得分:2)

哈希表方法如下:(在C ++ 11中使用unordered_set

  • 给定目标总和S ...

  • 对于每个元素x

    • 检查哈希表中是否存在S - x - 如果是,我们有2个号码xS - x

    • x插入哈希表。

这在预期的O(n)时间内运行。


此外,您的方法仅为O(n log n)。对于每个while循环和两个for循环,排序O(n log n)O(n),总共为O(n log n + n) = O(n log n)。好吧,假设.size()O(1) - 我知道它可能是O(n)(总共有O(n²)个运行时间),至少对于较旧的编译器而言。

虽然我不太确定最后两个for循环在那里做什么 - 当你从while循环中断时,你将拥有你的2个数字。