是否有可能找到阵列中两个数字之间的最大压降,其复杂度小于O(n²)?

时间:2014-01-21 10:38:07

标签: complexity-theory

我有一个数组的数组。 我需要找到2个数字之间的最大差异,但最大数字在数组中的最小数字之前。

public static int maximalDrop (int [] a)

例如:

对于数组5,21,3,27,12,24,7,6,4,结果将为23(27 - 4)

对于数组5,21,3,22,12,7,26,14,结果将是18(21 - 3)

我的解决方案是获取数组中的第一个元素(这个数字将是大的)并检查数字和数组中所有其他数字之间的差异,之后执行相同的操作,但使用下一个数字数组,当然比较差异,并返回最大的一个。 我的解决方案是O(n²),所以我可以做得更少吗?

6 个答案:

答案 0 :(得分:6)

除非我误解了这个问题,否则我相信你可以在阵列的一次传递中做到这一点。您只需要跟踪到目前为止您所看到的最大值和最大差异。当您通过数组计算当前数字与目前为止所见的最大值之间的差异时。

所以对于你的第二个例子5,21,3,22,12,7,26,14

1: 5 is first value so set maximum to 5
2: 21 > 5 so reset maximum
3: 21 - 3 = 18
4: 22 > 21 so reset maximum
5: 22 - 12 = 10
6: 22 - 7  = 15
7: 26 > 22 so reset maximum
8: 26 - 14 = 12

当你找到一个新的最大值时,较小的数字出现在较大的数字之后,需要从这个新的最大值中减去数组中超出它的任何小数字。

所需答案是在此过程中看到的最大值 - 在这种情况下是在步骤3中计算的18。

答案 1 :(得分:0)

试试这个:

public static int maximalDrop (int[]a)
{
    int max= a[0];
    int dif= 0;
    for (int i=0; i<a.length; i++)
    {
        if(a[i]>max){
            max=a[i];
            if (dif<max-a[i+1])
            {
             dif=max-a[i+1];   
            }
        }
    }
    return dif;    
}

答案 2 :(得分:0)

好吧,我不确定我对这个问题的理解是否正确。但是,我认为您只需要跟踪到目前为止已经访问过的最大值和下降值。 考虑一下,如果a-b产生的最大跌幅;并且在b之前存在另一个值c大于a,则c-b肯定大于a-b,那么最大的下降应该是c-b。 虽然稍后会有更大的数字替换最大值,但它不会改变掉落值,除非它可以产生更大的下降。

这段代码可能有用,它在java中: 所以时间成本是O(n)。 如果我误解了一些概念,请告诉我。

public int findDrop(int[] ar){ int max = ar[0]; int drop = 0; for(int i=1;i<ar.length;i++){ if(ar[i] > max){ max = ar[i]; } else { if(max - ar[i] > drop){ drop = max - ar[i]; } } } return drop; }

答案 3 :(得分:0)

O(N)解决方案

public static int findMaxDrop(int[] arr){
    int maxSoFar=0;
    int currDrop=0;
    int maxDrop=0;

    for(int i=0;i<=arr.length-1;i++){
        if(arr[i] > maxSoFar){
            maxSoFar=arr[i];
        }else{
            currDrop = maxSoFar-arr[i];
            maxDrop=Math.max(currDrop, maxDrop);
        }
    }
    return maxDrop;
}

答案 4 :(得分:-1)

你应该只需要一个小调整来合并排序,以便在O(n log n)中执行此操作!

答案 5 :(得分:-2)

可以在O(n)中完成:

  1. merge sort列表
  2. 获取最小和最大项目并计算它们之间的差异。