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

}

  

 

你可能感兴趣的:(slice)