【发布时间】:2017-03-18 11:20:40
【问题描述】:
给定一个数组,任务是找到数组中最大的可整子集。如果对于子集中的每一对 (x, y),要么 x 整除 y,要么 y整除 x,则子集称为可整除。
例子
输入:arr[] = {1, 16, 7, 8, 4} 输出:16 8 4 1 在输出子集中,对于每一对, 要么第一个元素除以第二个 或先除以第二次。
输入:arr[] = {2, 4, 3, 8} 输出:8 4 2
这是我想出的。时间复杂度为 O(n^2)。可以改进吗?
public static int[] largestDivisibleSubset2(int[] a){
Arrays.sort(a);
int index=0;
int maxDivCount=0;
for(int i=0;i<a.length;i++){
int currentDivCount=0;
for (int j=i;j<a.length;j++ ) {
if(a[j]%a[i]==0){
currentDivCount++;
}
}
if(currentDivCount>maxDivCount){
index = i;
maxDivCount = currentDivCount;
}
currentDivCount = 0;
}
int[] res = new int[maxDivCount];
int k=0;
for(int i=0;i<a.length;i++){
if(a[i]%a[index]==0){
res[k++] = a[i];
}
}
return res;
}
【问题讨论】:
-
注意:你必须检查你的元素是否不为0,否则你会得到
java.lang.ArithmeticException: / by zero -
数字可以有多大?可能是
O(N * d + N * sqrt(MAX_VAL)),其中d是输入数组的所有元素的最大除数。 -
您能否提供更多信息,说明您为何担心时间复杂度(超过代码简单性)?大概您正在考虑该系列中的大量项目?如果是这样,您是否想要包含并行化任务的答案?
-
@sprinter - 准备面试队友 :)
-
您的经历可能会有所不同,但就个人而言,我从未要求某人在面试工作时通过检查来优化代码性能。我一直要求他们优雅地解决问题或发现错误或提高可读性/可测试性/可维护性。