Codility编程课一MinAvgTwoSlice

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Lockey23/article/details/81392807

MinAvgTwoSlice

Find the minimal average of any slice containing at least two elements.

Task description

A non-empty array A consisting of N integers is given. A pair of integers (P, Q), such that 0 ≤ P < Q < N, is called a slice of array A (notice that the slice contains at least two elements). The average of a slice (P, Q) is the sum of A[P] + A[P + 1] + … + A[Q] divided by the length of the slice. To be precise, the average equals (A[P] + A[P + 1] + … + A[Q]) / (Q − P + 1).

For example, array A such that:

A[0] = 4
A[1] = 2
A[2] = 2
A[3] = 5
A[4] = 1
A[5] = 5
A[6] = 8

contains the following example slices:

slice (1, 2), whose average is (2 + 2) / 2 = 2;
slice (3, 4), whose average is (5 + 1) / 2 = 3;
slice (1, 4), whose average is (2 + 2 + 5 + 1) / 4 = 2.5.
The goal is to find the starting position of a slice whose average is minimal.

Write a function:

def solution(A)

that, given a non-empty array A consisting of N integers, returns the starting position of the slice with the minimal average. If there is more than one slice with a minimal average, you should return the smallest starting position of such a slice.

For example, given array A such that:

A[0] = 4
A[1] = 2
A[2] = 2
A[3] = 5
A[4] = 1
A[5] = 5
A[6] = 8

the function should return 1, as explained above.

Assume that:

N is an integer within the range [2..100,000];
each element of array A is an integer within the range [−10,000..10,000].

Complexity:

expected worst-case time complexity is O(N);
expected worst-case space complexity is O(N) (not counting the storage required for input arguments).

解答参考自:https://codesays.com/2014/solution-to-min-avg-two-slice-by-codility/

The key to solve this task is these two patterns:

(1) There must be some slices, with length of two or three, having the minimal average value among all the slices.
(2) And all the longer slices with minimal average are built up with these 2-element and/or 3-element small slices.

关于此题的解法要两个关键点:

1、在所有的子序列中一定存在长度为2或者3的序列含有全局最小平均值
2、所有的长序列都可以切分为长度为2或者3的子序列

所以不要问:

为什么不能按4个或者更多元素来进行切分,因为它们可以被切分为长度为2或者3的子序列

这里写图片描述

测试用例:

print solution([4,2,2,5,1,3,1,1,1])
print solution([-3, -5, -8, -4, -10])
print solution([8, 0, 0, 8])
print solution([1,3,2,1])

猜你喜欢

转载自blog.csdn.net/Lockey23/article/details/81392807