【发布时间】:2018-09-16 23:46:49
【问题描述】:
如何在数组中找到连音/对 i、j、k 的数量,使得 a[i] + a[j] = 2 * a[k]。复杂度应该是 O(n * logn) 或 O(n),因为 n
编辑 2(重要):abs(a[i])
编辑: i, j, k 都必须是不同的。
这是我的代码,但是太慢了,复杂度为 O(is n^2 logn)。
#include <bits/stdc++.h>
using namespace std;
int binarna(vector<int> a, int k){
int n = a.size();
int low = 0, high = n - 1;
bool b = false;
int mid;
while(low <= high){
mid = (low + high) / 2;
if (a[mid] == k){
b = true;
break;
}
if (k < a[mid])
high = mid - 1;
else
low = mid + 1;
}
if (b)
return mid;
else
return -1;
}
int main()
{
int n;
cin >> n;
vector<int> a(n);
for (auto& i : a)
cin >> i;
sort(a.begin(), a.end());
int sol = 0;
for (int i = 0; i < n - 1; ++i){
for (int j = i + 1; j < n; ++j){
if ((a[i] + a[j]) % 2)
continue;
int k = (a[i] + a[j]) / 2;
if (binarna(a, k) != -1)
++sol;
}
}
cout << sol << '\n';
}
【问题讨论】:
-
i==j==k是有效答案还是有其他限制?你都尝试了些什么? SO 不是代码编写网站。 -
看起来你可以使用一些
for循环。 -
@RichardCritten Values "in array",不仅仅是索引
-
通过按值将
a传递给函数,你做了很多不必要的复制。 -
对于每个
i != j计算a[i] + i[j]。如果是奇数,则没有k。否则,搜索数组以找到等于(a[i] + i[j])/2的元素。如果有,你有一个解决方案。您可能还想限制这个问题:数组元素是唯一的吗?数组是否排序? [您的代码似乎正在尝试使用二进制搜索,这表明数组至少已排序,但问题中未指定]。