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

  

 

posted @ 2014-07-27 11:53  阿牧遥  阅读(521)  评论(0编辑  收藏  举报