Given an array with positive and negative numbers, find themaximum average subarray
which length should be greater or equal to given lengthk
.
Notice
It's guaranteed that the size of the array is greater or equal tok.
Have you met this question in a real interview?
Yes
Example
Given nums =[1, 12, -5, -6, 50, 3]
, k =3
Return15.667
// (-6 + 50 + 3) / 3 = 15.667
class Solution {
public:
/
**
* @param nums an array with positive and negative numbers
* @param k an integer
* @return the maximum average
*/
double maxAverage(vector<int>& nums, int k) {
// Write your code here
double l = INT_MAX, r = INT_MIN;
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] < l) {
l = nums[i];
}
if (nums[i] > r) {
r = nums[i];
}
}
while (r - l >= 1e-6) {
double m = (r + l) / 2;
if (CheckAverage(nums, k, m))
l = m;
else
r = m;
}
return l;
}
bool CheckAverage(vector<int>& nums, int k, double val) {
vector<double> sums(nums.size() + 1, 0);
double min_pre = 0;
for (int i = 1; i <= nums.size(); ++i) {
sums[i] = sums[i - 1] + nums[i - 1] - val;
if (i >= k) {
min_pre = min(min_pre, sums[i - k]);
}
if (i >= k && sums[i] >= min_pre) {
return true;
}
}
return false;
}
};