如何计算给定数组中的对(P,Q)的数量,Q> P,使得C [P] * C [Q]≥C[P] + C [Q]的复杂度为O(N )?
答案 0 :(得分:1)
我认为这在一般情况下是不可能的(对于实数),但在数字的某些假设下,它是可能的。
例如,考虑非负整数的情况:
让X
和Y
为非负整数:
X=0
和Y=0
:X + Y = X * Y
X=0
或X=1
,对于任何Y>0
:X + Y > X * Y
Y=0
或Y=1
,对于任何X>0
:X + Y > X * Y
X + Y <= X * Y
因此,我们可以遍历整个数组,并计算0
,1
&,以及1
&#39;以及O(n)
&#39; s(这需要n
次):
我们只对双方的组合感兴趣,其中两个数字来自组&#34;大于1&#34;或组#&#34; 0&#39; s&# 34; (任何其他数字组合都不满足条件)。
我们假设第一组中的对数为m
,第二组为X * Y >= X + Y
,满足条件n(n-1)/2 + m(m-1)/2
的对的总数为:< / p>
{{1}}(表示每组中可能的对数)。
这种方法可以扩展到其他类别的数字(例如有符号整数)。
答案 1 :(得分:0)
你不能像O(N)复杂的那样直接编程,因为你有N ^ 2个组合可以尝试。
只需执行嵌套for循环执行比较并计算结果。
即
int count = 0;
for (int i=0;i<len;i++) {
for (int j=i+1;j<len;j++) {
if (arr[i]*arr[j] >= arr[i]+arr[j]) {
count++;
}
}
}
请注意,我在内循环中从i循环,因此每对只扫描一次。
听起来有一些&#34;技巧&#34;所涉及的算法将允许你获得线性,但这是一个数学/算法问题,而不是编程问题而且我看不到任何明显的问题。
答案 2 :(得分:0)
我自己不是数学脑,但我在这里看到了一种模式。 你没有把它包括在这里,但有假设在这里真的有帮助。
看一下例子: [让我们假设自然数字]:1,2,3,4,5,6,7,8 ...会给你对:
在这里我发布了我的代码,得分为45%所以它不是那么糟糕。
我希望有人会抓住我的想法并以某种方式改善这一点。祝你好运:)。
inline double real (std::vector<int> &A, std::vector<int> &B, int i)
{
return (double)((double)A[i] + ((double)B[i]/1000000));
}
int solution(std::vector<int> &A, std::vector<int> &B)
{
int size = A.size();
int pairs = 0;
if (size < 2) return pairs;
for(int x = 0; x<size; ++x)
{
for(int y = x+1; y<size; ++y)
{
double lx = real(A,B,x);
double ly = real(A,B,y);
double m = lx*ly;
double a = lx+ly;
if(m<a) continue;
pairs+=(size-y);
if (pairs >= 1000000000) return 1000000000
break;
}
}
return pairs;
}