您的位置:首页 > 其它

Codility lesson3 1. MinAvgTwoSlice

2015-09-06 21:42 501 查看
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:



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:


class Solution { public int solution(int[] A); }


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:



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), beyond input storage (not counting the storage required for input arguments).


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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: