我一直在尝试Codility.com上的编码挑战 这是我尝试的其中一个问题:
给出了由N个整数组成的非空零索引数组A.一个 一对整数(P,Q),使得0≤P<1。 Q&lt; N,被称为切片 数组A(注意切片包含至少两个元素)。该 切片的平均值(P,Q)是A [P] + A [P + 1] + ... + A [Q]的总和 除以切片的长度。确切地说,平均值等于 (A [P] + A [P + 1] + ... + A [Q])/(Q - P + 1)。
例如,数组A使得:
A[0] = 4 A[1] = 2 A[2] = 2 A[3] = 5 A[4] = 1 A[5] = 5 A[6] = 8
包含以下示例切片:
切片(1,2),其平均值为(2 + 2)/ 2 = 2;切片(3,4),其中 平均值为(5 + 1)/ 2 = 3;切片(1,4),平均值为(2 + 2 + 5 + 1)/ 4 = 2.5。目标是找到平均值最小的切片的起始位置。
写一个函数:
class Solution {public int solution(int [] A); }
给定一个由N个整数组成的非空零索引数组A, 返回具有最小平均值的切片的起始位置。 如果有多个切片具有最小平均值,则应该 返回这样一个切片的最小起始位置。
例如,给定数组A使得:
A[0] = 4 A[1] = 2 A[2] = 2 A[3] = 5 A[4] = 1 A[5] = 5 A[6] = 8
该函数应返回1,如上所述。
我提交了我的答案,得到了60%。我的解决方案是正确的,我通过了所有测试用例。我得到60%的原因是因为时间的复杂性。我的解决方案花了太长时间才能运行大型测试用例。
这是我在Java中的解决方案:
class Solution {
public int solution(int[] A) {
int size = A.length;
if (size == 2) {
return 0;
}
int sizeLessOne = size - 1;
int start = 0;
double min = 0;
boolean isFirst = true;
for (int i = 0; i < sizeLessOne; i++) {
int val1 = A[i];
for (int j = i + 1; j < size; j++) {
int val2 = A[j];
double avg = ((double) val1 + val2) / (j - i + 1);
if (isFirst || avg < min) {
min = avg;
start = i;
if (isFirst) {
isFirst = false;
}
}
val1 += val2;
}
}
return start;
}
}
public class SolutionRunner {
public static void main(String[] args) {
Solution s = new Solution();
int[] A = {4,2,2,5,1,5,8};
System.out.println(s.solution(A));
}
}
基于我的代码,由于嵌套for循环,我最坏的情况时间复杂度是O(N ^ 2)。 O(N)的预期更糟糕的情况。我不确定如何实现这一点。
提前致谢。
答案 0 :(得分:3)
您可以在$newvariable = $_POST['a'].$_POST['b'].$_POST['c'];
中执行此操作,因为始终存在大小为2或3的最佳子阵列。
假设您有一个大小为O(n)
的最佳子阵列S
。
n > 3
可以分为两个子阵列:S
,大小为S'
,2
为S''
。 size n - 2 >= 2
和Avg(S') >= Avg(S)
,因为Avg(S'') >= Avg(S)
是最佳的。但是S
,因此Avg(S) >= min(Avg(S'), Avg(S''))
。所以Avg(S) = Avg(S') = Avg(S'')
也是最佳的。