*[codility]MinAvgTwoSlice

时间:2021-01-14 16:46:48

https://codility.com/demo/take-sample-test/min_avg_two_slice

此题要求一个数组子段的最小的平均数(返回第一个数字的index)。刚开始想记录sum,也没用,因为所有子段的组合是O(n^2)的。后来看解释发现,最小值必然存在于长度为2或3的子段中(长度为3的子段也无法分解)。可以用反证法,如果有一个长度大于3的子段,均值小于之前找出的长度2和3的子段均值,那么必然可以在这个子段中找到均值更小的长度2和3的子段,矛盾。

int solution(vector<int> &A) {
// write your code in C++11
double minVal = (A[0] + A[1]) / 2;
int result = 0;
int N = A.size();
for (int i = 0; i < N - 1; i++)
{
double avg = (A[i] + A[i+1])/2.0;
if (avg < minVal)
{
minVal = avg;
result = i;
}
}
for (int i = 0; i < N - 2; i++)
{
double avg = (A[i] + A[i+1] + A[i+2])/3.0;
if (avg < minVal)
{
minVal = avg;
result = i;
}
}
return result;
}