我有一个数组的数组。 我需要找到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²),所以我可以做得更少吗?
答案 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)中完成: