所以我试图解决从数组中找到两个数字的问题,以便它们加起来一个特定的目标数。 解决它的最简单方法(它给出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)时间来解决这个问题? 我听说过有关哈希和地图的事情,但不知道它们是什么以及如何使用它们。
答案 0 :(得分:2)
哈希表方法如下:(在C ++ 11中使用unordered_set
)
给定目标总和S
...
对于每个元素x
:
检查哈希表中是否存在S - x
- 如果是,我们有2个号码x
和S - 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个数字。