题目
给出一个整数数组,有正有负。找到这样一个子数组,他的长度大于等于 k
,且平均值最大。
注意事项
保证数组的大小 >= k
样例
给出 nums = [1, 12, -5, -6, 50, 3]
, k = 3
返回 15.667
// (-6 + 50 + 3) / 3 = 15.667
分析
代码
public class Solution {
/**
* @param nums an array with positive and negative numbers
* @param k an integer
* @return the maximum average
*/
public double maxAverage(int[] nums, int k) {
if(nums==null || nums.length==0) return 0.0;
if(k==0) return 0.0;
int n = nums.length;
if(n<k) return 0.0;
double min=Integer.MAX_VALUE;
double max=Integer.MIN_VALUE;
for(int i=0; i<n; i++){
max = Math.max(max, nums[i]);
min = Math.min(min, nums[i]);
}
while(max-min>1e-6){
double mid = (max+min)/2.0;
if(check(nums, mid, k)==1){
min = mid;
}else{
max = mid;
}
}
return max;
}
public int check(int[] nums, double mid, int k){
double[] s = new double[nums.length+1];
s[0]=0;
double min=0;
for(int i=1; i<=nums.length; i++){
s[i] = s[i-1]+nums[i-1]-mid;
if(i>=k){
if(s[i]>=min){
return 1;//真实值更大
}
min = Math.min(min, s[i-k+1]);
}
}
return 0;//真实值更小
}
}