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; } } |
相关文章推荐
- Fresco 源码分析(一) DraweeView-DraweeHierarchy-DraweeController(MVC) DraweeHierachy+DraweeController的分析
- 2014-2015年终总结
- java线程池(一) -- 线程基础
- spring mvc拦截器
- C程序设计----UNIX系统接口
- log4j详解
- 编写Java程序的三十个基本规则
- POJ-2195 Going Home
- 云南彝良村民河中捕鱼捞到2000余克毒品
- INNO&&DELPHI
- linux计划任务作业
- Linux内核大讲堂 (三) 解不开的"/"情结 http://blog.csdn.net/z2007b/article/details/6575809
- ac自动机
- lightoj1074 最短路
- Oracle表与索引的分析及索引重建
- linux命令scp---linux之间的文件copy
- 有关Java文件名及其他命名规则
- CodeForces A. Sereja and Swaps(暴力+贪心啊)
- 判断是否在微信浏览器
- Push导航栏黑影问题