*[codility]MinAvgTwoSlice
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; }