时间复杂性改进

时间:2017-09-18 10:15:57

标签: java algorithm time complexity-theory

我一直在尝试Codility.com上的编码挑战 这是我尝试的其中一个问题:

  

给出了由N个整数组成的非空零索引数组A.一个   一对整数(P,Q),使得0≤P<1。 Q&lt; N,被称为切片   数组A(注意切片包含至少两个元素)。该   切片的平均值(P,Q)是A [P] + A [P + 1] + ... + A [Q]的总和   除以切片的长度。确切地说,平均值等于   (A [P] + A [P + 1] + ... + A [Q])/(Q - P + 1)。

     

例如,数组A使得:

A[0] = 4
A[1] = 2
A[2] = 2
A[3] = 5
A[4] = 1
A[5] = 5
A[6] = 8
     

包含以下示例切片:

     

切片(1,2),其平均值为(2 + 2)/ 2 = 2;切片(3,4),其中   平均值为(5 + 1)/ 2 = 3;切片(1,4),平均值为(2 + 2 + 5   + 1)/ 4 = 2.5。目标是找到平均值最小的切片的起始位置。

     

写一个函数:

     

class Solution {public int solution(int [] A); }

     

给定一个由N个整数组成的非空零索引数组A,   返回具有最小平均值的切片的起始位置。   如果有多个切片具有最小平均值,则应该   返回这样一个切片的最小起始位置。

     

例如,给定数组A使得:

A[0] = 4
A[1] = 2
A[2] = 2
A[3] = 5
A[4] = 1
A[5] = 5
A[6] = 8
     

该函数应返回1,如上所述。

我提交了我的答案,得到了60%。我的解决方案是正确的,我通过了所有测试用例。我得到60%的原因是因为时间的复杂性。我的解决方案花了太长时间才能运行大型测试用例。

这是我在Java中的解决方案:

class Solution {
    public int solution(int[] A) {
        int size = A.length;

        if (size == 2) {
            return 0;
        }

        int sizeLessOne = size - 1;
        int start       = 0;
        double min      = 0;
        boolean isFirst = true;

        for (int i = 0; i < sizeLessOne; i++) {
            int val1  = A[i];
            for (int j = i + 1; j < size; j++) {
                int val2   = A[j];
                double avg = ((double) val1 + val2) / (j - i + 1);
                if (isFirst || avg < min) {
                    min   = avg;
                    start = i;
                    if (isFirst) {
                        isFirst = false;
                    }
                }
                val1 += val2;
            }
        }

        return start;
    }
}

public class SolutionRunner {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] A    = {4,2,2,5,1,5,8};
        System.out.println(s.solution(A));
    }
}

基于我的代码,由于嵌套for循环,我最坏的情况时间复杂度是O(N ^ 2)。 O(N)的预期更糟糕的情况。我不确定如何实现这一点。

提前致谢。

1 个答案:

答案 0 :(得分:3)

您可以在$newvariable = $_POST['a'].$_POST['b'].$_POST['c']; 中执行此操作,因为始终存在大小为2或3的最佳子阵列。

假设您有一个大小为O(n)的最佳子阵列Sn > 3可以分为两个子阵列:S,大小为S'2S''size n - 2 >= 2Avg(S') >= Avg(S),因为Avg(S'') >= Avg(S)是最佳的。但是S,因此Avg(S) >= min(Avg(S'), Avg(S''))。所以Avg(S) = Avg(S') = Avg(S'')也是最佳的。