Welcome to Subscribe On Youtube
644. Maximum Average Subarray II
Description
You are given an integer array nums
consisting of n
elements, and an integer k
.
Find a contiguous subarray whose length is greater than or equal to k
that has the maximum average value and return this value. Any answer with a calculation error less than 10-5
will be accepted.
Example 1:
Input: nums = [1,12,-5,-6,50,3], k = 4 Output: 12.75000 Explanation: - When the length is 4, averages are [0.5, 12.75, 10.5] and the maximum average is 12.75 - When the length is 5, averages are [10.4, 10.8] and the maximum average is 10.8 - When the length is 6, averages are [9.16667] and the maximum average is 9.16667 The maximum average is when we choose a subarray of length 4 (i.e., the sub array [12, -5, -6, 50]) which has the max average 12.75, so we return 12.75 Note that we do not consider the subarrays of length < 4.
Example 2:
Input: nums = [5], k = 1 Output: 5.00000
Constraints:
n == nums.length
1 <= k <= n <= 104
-104 <= nums[i] <= 104
Solutions
-
class Solution { public double findMaxAverage(int[] nums, int k) { double eps = 1e-5; double l = 1e10, r = -1e10; for (int x : nums) { l = Math.min(l, x); r = Math.max(r, x); } while (r - l >= eps) { double mid = (l + r) / 2; if (check(nums, k, mid)) { l = mid; } else { r = mid; } } return l; } private boolean check(int[] nums, int k, double v) { double s = 0; for (int i = 0; i < k; ++i) { s += nums[i] - v; } if (s >= 0) { return true; } double t = 0; double mi = 0; for (int i = k; i < nums.length; ++i) { s += nums[i] - v; t += nums[i - k] - v; mi = Math.min(mi, t); if (s >= mi) { return true; } } return false; } }
-
class Solution { public: double findMaxAverage(vector<int>& nums, int k) { double eps = 1e-5; double l = *min_element(nums.begin(), nums.end()); double r = *max_element(nums.begin(), nums.end()); auto check = [&](double v) { double s = 0; for (int i = 0; i < k; ++i) { s += nums[i] - v; } if (s >= 0) { return true; } double t = 0; double mi = 0; for (int i = k; i < nums.size(); ++i) { s += nums[i] - v; t += nums[i - k] - v; mi = min(mi, t); if (s >= mi) { return true; } } return false; }; while (r - l >= eps) { double mid = (l + r) / 2; if (check(mid)) { l = mid; } else { r = mid; } } return l; } };
-
class Solution: def findMaxAverage(self, nums: List[int], k: int) -> float: def check(v: float) -> bool: s = sum(nums[:k]) - k * v if s >= 0: return True t = mi = 0 for i in range(k, len(nums)): s += nums[i] - v t += nums[i - k] - v mi = min(mi, t) if s >= mi: return True return False eps = 1e-5 l, r = min(nums), max(nums) while r - l >= eps: mid = (l + r) / 2 if check(mid): l = mid else: r = mid return l
-
func findMaxAverage(nums []int, k int) float64 { eps := 1e-5 l := float64(slices.Min(nums)) r := float64(slices.Max(nums)) check := func(v float64) bool { s := 0.0 for _, x := range nums[:k] { s += float64(x) - v } if s >= 0 { return true } t := 0.0 mi := 0.0 for i := k; i < len(nums); i++ { s += float64(nums[i]) - v t += float64(nums[i-k]) - v mi = math.Min(mi, t) if s >= mi { return true } } return false } for r-l >= eps { mid := (l + r) / 2 if check(mid) { l = mid } else { r = mid } } return l }
-
function findMaxAverage(nums: number[], k: number): number { const eps = 1e-5; let l = Math.min(...nums); let r = Math.max(...nums); const check = (v: number): boolean => { let s = nums.slice(0, k).reduce((a, b) => a + b) - v * k; if (s >= 0) { return true; } let t = 0; let mi = 0; for (let i = k; i < nums.length; ++i) { s += nums[i] - v; t += nums[i - k] - v; mi = Math.min(mi, t); if (s >= mi) { return true; } } return false; }; while (r - l >= eps) { const mid = (l + r) / 2; if (check(mid)) { l = mid; } else { r = mid; } } return l; }