计算所有连续子阵列中存在的最大元素

时间:2015-08-07 21:03:32

标签: java algorithm data-structures

由N个正整数组成的数组A.阵列A有N × (N+1) / 2个非空的连续子阵列。

我们必须计算所有连续子阵列中存在的最大元素 例如:

1 2 3 
Subarray List :
[1]
[2]
[3]
[1,2]
[2,3]
[1,2,3]

Maximum Element :
[1]
[2]
[3]
[2]
[3]
[3]

我的方法:
使用Segment Tree查询区间中存在的最大元素

代码:

public static void get_max_freq(int a , int b , ArrayList<Long> freq ,ArrayList<Integer> P , int n , int[] A){

      if(a>b) return;

    int index = query(1,0,n, a, b, A);  // Segment Tree O(Logn)

    long temp = (index-a+1)*(b-index+1);
    freq.add(temp);
    P.add(A[index));

    get_max_freq(a,index-1, freq, P, n, A);
    get_max_freq(index+1, b, freq, P,n, A);

}

我想知道如果元素在数组中不是唯一的,我的解决方案是正确的。

是否有比这更快更好的解决方案。

1 个答案:

答案 0 :(得分:2)

我认为你过于复杂了。要构建细分树,您需要O(n)空间,并且您将在n(n+1)/2时间内执行此操作。在此之后,您需要回答O(n^2*logn)个问题,每个查询都需要O(logn),所以基本上你需要花费O(n)

Bruteforce方法(获取所有间隔并计算每个间隔的最大值)将在O(n^3)内存和[a0, a1, a2, ..., an]中运行。

但您可以使用以下简单算法计算所有最大值。让你的数组为max(a0-a0), max(a0-a1), ... max(a0-an)。从第0个元素开始,计算从该元素开始的范围内的所有最大值:O(n)。您可以在max(ai-an) = max( max(ai-a(n-1)), an)中执行此操作,因为O(n^2)(之前的最大和当前元素)。因此,您在O(n^2)中计算a0的值,然后是a1,依此类推。您可以存储它们,然后以您想要的格式输出它们。最后,您使用超级简单的算法获得了O(n^2)空格和时间。

PS 注意到你不能及时做到比n*(n+1)/2好,因为你需要至少输出textField.returnKeyType = UIReturnKeyType.Done 元素,所以你只能希望减少空间复杂度