计算具有特定条件的给定数组中的对数

时间:2014-03-17 13:29:53

标签: algorithm math time-complexity

如何计算给定数组中的对(P,Q)的数量,Q> P,使得C [P] * C [Q]≥C[P] + C [Q]的复杂度为O(N )?

3 个答案:

答案 0 :(得分:1)

我认为这在一般情况下是不可能的(对于实数),但在数字的某些假设下,它是可能的。

例如,考虑非负整数的情况:

XY为非负整数:

  • 如果X=0Y=0X + Y = X * Y
  • 如果X=0X=1,对于任何Y>0X + Y > X * Y
  • 如果Y=0Y=1,对于任何X>0X + Y > X * Y
  • 在任何其他情况下:X + Y <= X * Y

因此,我们可以遍历整个数组,并计算01&,以及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)

我自己不是数学脑,但我在这里看到了一种模式。 你没有把它包括在这里,但有假设在这里真的有帮助。

  • 数组按非递减顺序排序
  • 如果输出&gt; = 1 000 000 000则返还1 000 000 000
  • (tip)如果pair(x,y)是好的,那么这行中的任何下一对都是好的(x,y + 1)(x,y + n)你只需要找到第一个。为什么?看看(x + y)和(x * y)的情节是怎样的...... 有一个联合点,之后每一对都会起作用。

看一下例子: [让我们假设自然数字]:1,2,3,4,5,6,7,8 ...会给你对:

    • 对是(x,y) - &gt; [(A [x] * A [y])&gt; =(A [x] + A [y])]
  • none for x == 1:
    • (并行绘制a + b和a * b,a = 1,a = 0,无论b),
  • A [y] == 3或更多A [x] == 2(y = 2休息条件y> x)
  • A [y] == 4或更多A [x] == 3等

在这里我发布了我的代码,得分为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;
}