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

Given an array of integers, find two numbers such that they add up to a specific target number

本文关键字:起来 于一个 目标 数组 整数 一个 数字 两个      更新时间:2023-10-16

所以我试图解决从数组中找到两个数字的问题,这样它们加起来就是一个特定的目标数字。最简单的解决方法(它给出了时间限制错误,因为它需要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)时间解决这个问题?我听说过hash和map,但不知道它们是什么,也不知道如何使用

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

  • 给定目标金额S

  • 每个元素x:

    • 检查S - x是否存在于哈希表中-如果存在,我们有两个数字xS - x

    • x插入哈希表

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


同样,你的方法只有O(n log n)。这是排序的O(n log n),每个while循环和两个for循环的O(n),总共是O(n log n + n) = O(n log n)。好吧,这是假设.size()O(1) -我知道它可能是O(n)(给出O(n²)总运行时间),至少对于较旧的编译器。

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