我在课堂上得到了一个练习,需要以下内容:
由 N 个整数组成的数组 v 是循环排序的,如果该数组是有序的,或者 和
v[N‐1] ≤ v[0]
,∃k
例如0<k<N
。∀i≠k v[i] ≤ v[i+1]
例子:
给定一个包含多达 10 个正项的循环排序数组,计算正值的总和。对于最后一个例子,答案是 27。
我被要求在java中使用分而治之的方案来实现它,因为最坏情况下的复杂性是O(Log N),即 N 是数组大小。
到目前为止,我尝试旋转一个值,直到找到一个正值,然后知道其他正值是相邻的,就可以以 O(1) 的复杂度对 10 个正值的最大值进行求和。
我想过进行二分搜索来实现 O(Log N) 复杂度,但这不遵循分而治之的模式。
我可以轻松地通过 O(N) 复杂度来实现它,如下所示:
public static int addPositives(int[] vector){
return addPositives(vector,0,vector.length-1
}
public static int addPositives(int[] vector, int i0, int iN){
int k = (i0+iN)/2;
if (iN-i0 > 1){
return addPositives(vector,i0,k) + addPositives(vector,k+1,iN);
}else{
int temp = 0;
for (int i = i0; i <= iN; i++) {
if (vector[i]>0) temp+=vector[i];
}
return temp;
}
}
然而,试图达到 O(Log N) 却毫无进展,我该如何实现呢?
月关宝盒
交互式爱情
相关分类