【发布时间】:2014-02-07 18:42:35
【问题描述】:
给出了一个由 N 个整数组成的非空零索引数组 A。一对整数 (P, Q),使得 0 ≤ P 例如,数组 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,如上所述。
假设:
- N 是 [2..100,000] 范围内的整数;
- 数组 A 的每个元素都是 [−10,000..10,000] 范围内的整数。
复杂性:
- 预计最坏情况时间复杂度为 O(N);
- 预计最坏情况下的空间复杂度为 O(N),超出输入存储(不包括输入参数所需的存储)。
输入数组的元素可以修改。
这是我最好的解决方案,但在时间复杂度方面显然不是最优的。
有什么想法吗?
public int solution(int[] A) {
int result = 0;
int N = A.length;
int [] prefix = new int [N+1];
for (int i = 1; i < prefix.length; i++) {
prefix[i] = prefix[i-1] + A[i-1];
}
double avg = Double.MAX_VALUE;
for (int i = 1; i < N; i++) {
for (int j = i+1; j <=N; j++) {
double temp = (double)(prefix[j]-prefix[i-1]) /(double)(j-i+1);
if (temp < avg) {
avg = temp;
result = i-1;
}
}
}
return result;
}
【问题讨论】:
-
我认为您缺少切片 (0,1),因为您从 i = 1 和 j=i+1 开始计数。 j 应该给你 IndexOutOfBounds 异常。
-
为什么所有解决方案都检查 2 或 3 个元素的切片?有人可以向我解释一下吗?我怎样才能得出这个结论?谢谢
-
如果任何一个值为负数怎么办?表示元素 A[k],其中 0
-
@SimpleApp 为什么所有解决方案都检查 2 或 3 个元素的切片?...我尝试在我的回答中解释这一点。希望这会有所帮助。
-
@user3534759,解决方案适用于负数和 0。如果我们以您的示例为例,最小平均值为 A[3] + A[4] => 0.5。任何其他组合都比这更大。
标签: java