标签:
Task description
A non-empty zero-indexed 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:
The goal is to find the starting position of a slice whose average is minimal. Write a function:
that, given a non-empty zero-indexed 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:
Complexity:
Elements of input arrays can be modified. class Solution { public int solution(int[] A) { // write your code in Java SE 8 int left = 0; // use two pointers left and right to traverse the array int right = 1; int len = A.length; int sum = A[0] + A[1]; int sumLeft = 0; double avg = 0; double min = 10001; int res = 0; while(left < len-1 && right < len) { avg = (sum - sumLeft)/(double)(right - left + 1); // int / int can not get double if donot convert if(avg < min) { min = avg; res = left; } if(A[left] > avg && left < right - 1) { // when move left pointer can decrease the avg then move it. left++; sumLeft += A[left-1]; continue; // must has this, or may appear that right grow to len in next step and left has no chance to update. } if((right < len -1 && A[right+1] < avg) // when move right pointer can decrease the avg then move it. || left == right - 1) { // make sure threr is not "piece/0" right++; if(right < len) sum += A[right]; } else { left++; // if not move left sumLeft += A[left-1]; } } return res; } }
|
Codility lesson3 1. MinAvgTwoSlice
标签:
原文地址:http://www.cnblogs.com/michael-du/p/4787460.html