码迷,mamicode.com
首页 > 其他好文 > 详细

Codility lesson3 1. MinAvgTwoSlice

时间:2015-09-06 22:52:26      阅读:395      评论:0      收藏:0      [点我收藏+]

标签:

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

 

Codility lesson3 1. MinAvgTwoSlice

标签:

原文地址:http://www.cnblogs.com/michael-du/p/4787460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!