给定一个整数数组,找出两个数字,使它们加起来等于一个特定的目标数
Given an array of integers, find two numbers such that they add up to a specific target number
所以我试图解决从数组中找到两个数字的问题,这样它们加起来就是一个特定的目标数字。最简单的解决方法(它给出了时间限制错误,因为它需要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
是否存在于哈希表中-如果存在,我们有两个数字x
和S - 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循环中中断时,你会得到你的两个数字
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 有没有办法生成一个包含平方的序列,这些平方加起来就是一个整数平方?
- 我的代码仅适用于一个输入.请指教
- 将libstdc 静态链接起来是一个很好的做法
- 外部声明变量的定义适用于一个函数,但不适用于另一个函数
- 什么是UMThunkStubAMD64,为什么它看起来是一个瓶颈
- 'xxxx' :看起来像一个函数定义,但没有参数列表;跳过表观身体
- 使用 swig 使 C++ 类看起来像一个 numpy 数组
- 将多个(300)方法应用于一个数据的巧妙方法
- 确定谓词是否适用于一个范围的全部、部分或全部元素
- 依赖于一个空std::string的索引0是不是不好?
- 更改线看起来像一个箭头- c++构建器边界
- 如何使图片适合于一个静态控件vc++ win32
- 看起来像一个引用操作符,但不是c++定义
- 给定一个整数数组,找出两个数字,使它们加起来等于一个特定的目标数
- C++ 矢量复制适用于一个向量,但不适用于另一个向量
- 编写一个迭代器,使多个容器看起来像一个容器
- 我们如何在openGL中相对于一个点(而不是原点)旋转2d中的图形
- table':看起来像一个函数定义,但没有参数列表.——同时试图创造财产
- 并集对象的行为类似于一个结构