改善寻找满足对称关系的对的计数的运行时间

时间:2016-03-21 15:15:00

标签: java performance

我昨天进行了在线编码测试。问题并不难解决,但我无法达到所需的运行时间。问题如下:

给定1 <= M,N <= 10 ^ 5找到对A,B的计数:

  1. 1&lt; = A&lt; = M且1 <= B <= N
  2. (A ^ 1/3 + B ^ 1/3)^ 3是整数
  3. 这是我的解决方案:

    我注意到这种关系是对称的,所以如果假设M> = N,想象我们在M * N矩阵上搜索有效点,我只需要搜索矩阵的以下三个部分:

    1. 对角线上方的项目:(i,j)其中1 <= i <1。 j&lt; = N.如果找到有效对,则将计数器增加2。 (对称关系)

    2. 对角线元素。

    3. 项目int(i,j)其中N + 1&lt; = i&lt; = M,并且1 <= j <= N

    4. 我的java解决方案如下

      static int cubeNumbers(int M, int N) {
          int count = 0;
          if (N > M) {
              int temp = N;
              N = M;
              M = temp;
          }
          for (int i = 1; i <= N; i ++) {
              for (int j = i + 1; j <= N; j ++) {
                  if (isValid(i, j)) {count += 2;}
              }
              if (isValid(i, i)) {count += 1;}
          }
          for (int i = N + 1; i <= M; i ++) {
              for (int j = 1; j <= N; j ++) {
                  if (isValid(i, j)) {count += 1;}
              }
          }
          return count;
      }
      
      private static boolean isValid(int A, int B) {
          double result = Math.pow(Math.pow(A, 1.0/3) + Math.pow(B, 1.0/3), 3);
          return (result % 1) == 0;
      }
      

0 个答案:

没有答案