我编写了以下代码,用于计算子数组(至少两个元素)平均值最小的最小起始索引。
但是,我无法想出一种更快的方法,即O(n)或O(n log n)的方法。我无法想到任何遍历所有可能的子数组且时间复杂度不超过O(n^2)的方式:
并且在记录日志的情况下,它生成了正确的输出:
但是,我无法想出一种更快的方法,即O(n)或O(n log n)的方法。我无法想到任何遍历所有可能的子数组且时间复杂度不超过O(n^2)的方式:
#include <iostream>
#include <vector>
#include <limits>
using namespace std;
int solution(vector<int> &A) {
float previousAvg = 0.0;
float minAvg = numeric_limits<float>::max();
int minStartIx = numeric_limits<int>::max();
for (size_t i = 0; i < A.size(); ++i) {
for (size_t j = i + 1; j < A.size(); ++j) {
if (j == i + 1) {
previousAvg = (A[i] + A[j]) / 2.0;
cout << "avg(from=" << i << ", to=" << j << ") = " << previousAvg << endl;
} else {
previousAvg = (previousAvg * (j - i) + A[j]) / (j - i + 1);
cout << "avg(from=" << i << ", to=" << j << ") = " << previousAvg << endl;
}
if (previousAvg < minAvg) {
minAvg = previousAvg;
minStartIx = i;
}
}
}
return minStartIx;
}
int main() {
vector<int> A = {4, 2, 2, 5, 1, 5, 8};
cout << solution(A) << " must equal to 1" << endl;
return 0;
}
并且在记录日志的情况下,它生成了正确的输出:
avg(from=0, to=1) = 3
avg(from=0, to=2) = 2.66667
avg(from=0, to=3) = 3.25
avg(from=0, to=4) = 2.8
avg(from=0, to=5) = 3.16667
avg(from=0, to=6) = 3.85714
avg(from=1, to=2) = 2
avg(from=1, to=3) = 3
avg(from=1, to=4) = 2.5
avg(from=1, to=5) = 3
avg(from=1, to=6) = 3.83333
avg(from=2, to=3) = 3.5
avg(from=2, to=4) = 2.66667
avg(from=2, to=5) = 3.25
avg(from=2, to=6) = 4.2
avg(from=3, to=4) = 3
avg(from=3, to=5) = 3.66667
avg(from=3, to=6) = 4.75
avg(from=4, to=5) = 3
avg(from=4, to=6) = 4.66667
avg(from=5, to=6) = 6.5
1 must equal to 1