【发布时间】:2017-01-15 21:35:56
【问题描述】:
我遇到了这个问题“实现此方法以返回给定数组中两个最大数字的总和。”
我是这样解决的:
public static int sumOfTwoLargestElements(int[] a) {
int firstLargest = largest(a, 0, a.length-1);
int firstLarge = a[firstLargest];
a[firstLargest] = -1;
int secondLargest = largest(a, 0, a.length-1);
return firstLarge + a[secondLargest];
}
private static int largest(int s[], int start , int end){
if (end - start == 0){
return end;
}
int a = largest(s, start, start + (end-start)/2) ;
int b = largest(s, start + (end-start)/2+1 , end);
if(s[a] > s[b]) {
return a;
}else {
return b;
}
}
说明:我实现了一个方法“largeset”。该方法负责获取给定数组中的最大数。
我在同一个数组中调用该方法两次。第一次调用将获得第一个最大的数字。我将它放在变量中,并用“-1”数字替换它到数组中。然后,我第二次调用最大的方法。
有人可以告诉我这个算法的复杂性是什么?请
【问题讨论】:
-
您可以在第一遍中找到两个数字,并在第二遍中找到。它不会改变复杂性,但它会运行得更快。 :-)
-
+1 表示上述评论。此外,如果它只是一个数字列表,那么还有其他各种解决方法......如果你使用计数排序等机制,额外空间和 O(n) 时间复杂度可以忽略不计......
-
复杂性的真正衡量标准是未来读者的代码,他们花时间弄清楚它是如何工作的,什么时候更简单的算法可以完成这项工作。递归没有明显的好处,或者为什么需要两次遍历集合。当数组中的两个最大整数都小于 -1 时,该算法从根本上被破坏(返回不正确的结果)。哎呀!