在Python中寻找大小至少为k的子列表的最大平均值的程序
假设我们有一个称为nums的数字列表,另一个值为k,我们必须找到该列表中长度至少为k的任何子列表的最大平均值。
因此,如果输入类似于nums=[2,10,-50,4,6,6]k=3,则输出将为5.33333333,因为子列表[4、6、6]的平均值最大
为了解决这个问题,我们将遵循以下步骤-
左:=最小数字,右:=最大数字
s:=从索引0到k−1的所有数字的总和
maximum_avg:=s/k
当左<=右时,执行
右:=中−1
左:=中+1
sum1:=sum1+nums[i]
sum2:=sum2+nums[i-k]
cnt:=cnt+1
平均:=最大平均值和(sum1/((cnt+k))
如果sum2/cnt<=中,则
平均:=最大平均值和(sum1/((cnt+k))
sum1:=sum1−sum2
cnt:=0,sum2:=0
中:=(左+右)/2的整数
sum1:=s,平均:=s/k,sum2:=0,cnt:=0
对于范围在k到nums的i
maximum_avg:=maximum_avg和avg的最大值
如果平均>中间,则
除此以外,
返回maximum_avg
让我们看下面的实现以更好地理解-
示例
class Solution: def solve(self, nums, k): left, right = min(nums), max(nums) s = sum(nums[:k]) largest_avg = s / k while left <= right: mid = (left + right) //2 sum1 = s avg = s / k sum2 = 0 cnt = 0 for i in range(k, len(nums)): sum1 += nums[i] sum2 += nums[i − k] cnt += 1 avg = max(avg, sum1 / (cnt + k)) if sum2 / cnt <= mid: sum1 −= sum2 cnt = 0 sum2 = 0 avg = max(avg, sum1 / (cnt + k)) largest_avg = max(largest_avg, avg) if avg > mid: left = mid + 1 else: right = mid − 1 return largest_avg ob = Solution() nums = [2, 10, −50, 4, 6, 6] k = 3 print(ob.solve(nums, k))
输入值
[2, 10, −50, 4, 6, 6], k = 3输出结果
5.333333333333333