题目地址:

https://leetcode.com/problems/maximum-average-subarray-ii/

给定一个长 n n n数组 A A A,再给定一个小于等于 n n n的正整数 k k k,问 A A A里长度大于等于 k k k的平均值最大的子数组的平均值是多少。平均值以浮点数形式返回,有 1 0 − 5 10^{-5} 10−5的误差都算正确。

思路是二分答案,设 A A A的最大值是 M M M,最小值是 m m m,那么答案的范围是 [ m , M ] [m,M] [m,M],对于二分出的答案 x x x,只需要判断一下 A A A中是否存在一个长度大于等于 k k k的子数组的平均值是大于等于 x x x的,等价于问 [ A [ i ] − x ] i [A[i]-x]_i [A[i]−x]i​这个数组是否存在长度大于等于 k k k的且和大于等于 0 0 0的子数组。对于这个问题,可以这样做,设新数组 C = [ A [ i ] − x ] i C=[A[i]-x]_i C=[A[i]−x]i​,先求一下 C C C的长 k k k的前缀,如果该前缀已经非负了那当然存在,否则枚举子数组右端点 C [ j ] C[j] C[j],只需看一下以 C [ 0 : j − k ] C[0:j-k] C[0:j−k]为右端点的前缀(注意,这里还要把 0 0 0前缀考虑进去)里是否有小于等于 C [ j ] C[j] C[j]的,如果有那就存在。可以用一个变量动态记录前缀里的最小值。代码如下:

public class Solution {public double findMaxAverage(int[] nums, int k) {double l, r;// 算一下二分答案的答案范围l = r = nums[0];for (int i = 1; i < nums.length; i++) {l = Math.min(l, nums[i]);r = Math.max(r, nums[i]);}double eps = 1E-5;// 开始二分答案while (l + eps < r) {double m = l + (r - l) / 2;// 看一下nums里是否存在长度大于等于k的且平均值大于等于m的子数组if (check(nums, m, k)) {l = m;} else {r = m;}}return l;}private boolean check(int[] A, double t, int k) {double cur = 0, prev = 0;// 先算一下A - t这个数组的k前缀for (int i = 0; i < k; i++) {cur += A[i] - t;}// 如果这个前缀已经非负了,那说明存在,返回trueif (cur >= 0) {return true;}// min存A[0 : i - k]为右端点的前缀里的最小前缀值;// 注意0也要考虑进去,所以这里初始化为0而不是初始化为正无穷double min = 0;for (int i = k; i < A.length; i++) {cur += A[i] - t;prev += A[i - k] - t;min = Math.min(min, prev);if (cur - min >= 0) {return true;}}return false;}
}

时间复杂度 O ( n log ⁡ ( M − m ) ) O(n\log (M-m)) O(nlog(M−m))。

【Leetcode】644. Maximum Average Subarray II相关推荐

  1. 【LeetCode】152. Maximum Product Subarray

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...

  2. 【leetcode】644 最大子段和 II(二分查找,数组)

    题目链接:https://leetcode-cn.com/problems/maximum-average-subarray-ii/ 题目描述 给定一个包含 n 个整数的数组,找到最大平均值的连续子序 ...

  3. 【LeetCode】剑指 Offer 59 - II. 队列的最大值

    [LeetCode]剑指 Offer 59 - II. 队列的最大值 文章目录 [LeetCode]剑指 Offer 59 - II. 队列的最大值 package offer;import java ...

  4. 【LeetCode】剑指 Offer 58 - II. 左旋转字符串

    [LeetCode]剑指 Offer 58 - II. 左旋转字符串 文章目录 [LeetCode]剑指 Offer 58 - II. 左旋转字符串 一.字符串切片 二.列表遍历拼接 三.字符串遍历拼 ...

  5. 【LeetCode】剑指 Offer 32 - II. 从上到下打印二叉树 II

    [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 文章目录 [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 一.层序遍历 BFS 一. ...

  6. 【LeetCode】剑指 Offer 55 - II. 平衡二叉树

    [LeetCode]剑指 Offer 55 - II. 平衡二叉树 文章目录 [LeetCode]剑指 Offer 55 - II. 平衡二叉树 一.后序遍历 + 剪枝(从底至顶) 一.后序遍历 + ...

  7. 【LeetCode】剑指 Offer 68 - II. 二叉树的最近公共祖先

    [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 文章目录 [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 一.DFS 一.DFS 祖先的定义 ...

  8. 【LeetCode】剑指 Offer 57 - II. 和为s的连续正数序列

    [LeetCode]剑指 Offer 57 - II. 和为s的连续正数序列 文章目录 [LeetCode]剑指 Offer 57 - II. 和为s的连续正数序列 一.求和公式 二.滑动窗口(双指针 ...

  9. 【leetcode】963. Minimum Area Rectangle II

    题目如下: Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from ...

最新文章

  1. android中一种不支持的lua操作
  2. 2021-08-02 json文件批量转化mask,生成train.txt路径make_path.py
  3. java Bean 不需要自动生成get和set
  4. squid在企业网中的应用
  5. AgileEAS.NET SOA 中间件2013第四季度发布部分功能开源预告
  6. java面向对象第一章
  7. Linux学习路线指南
  8. hdu 2879【留坑】
  9. java的et5_Javascript与java相同的3des加密(使用etdesede/CBC/PKCS5Padding )
  10. 机器学习之 朴素贝叶斯、贝叶斯网络
  11. 文献信息检索与论文写作书籍(二)
  12. json解析数组 nlohmann_json解析数组 nlohmann_Nlohmann json学习
  13. html分行分列代码,表格内如何强制换行 选中单元格后,点击数据中的分列
  14. 80004005错误代码_Win7系统提示0X80004005错误代码怎样解决 Win7系统错误代码0x80004005的解决办法...
  15. win10 .Net Runtime Optimization Service占用大量CPU资源解决方法
  16. 常用Nginx反向代理配置
  17. 【项目笔记_RP552D】rtthread winusb 修改 vid 与 pid
  18. Oracle动态采样分析
  19. 关于.9图失效以及.9图不可以错过的细节点
  20. android 地图选房效果,概述-Android 室内地图SDK | 高德地图API

热门文章

  1. 推荐系统3--FM和FFM
  2. 数据化运营04 DAU、MAU、UV:谁是最有参考价值的活跃指标?
  3. 干货| 生鲜电商的冷库内部该怎么设计(含案例)
  4. 数据挖掘与数据分析的主要区别是什么?
  5. 让柯洁痛哭的AlphaGo,竟耗资3500万美元,耗电量相当于12760个大脑
  6. java调用帆软cpt文件_报表中心FineReport中java如何直接调用报表打印
  7. 万字长文讲清楚4D毫米波雷达
  8. 怎样用手机把视频变成GIF表情包?原来那么简单,网友:看完涨知识了
  9. 区块链中nonce与难度系数
  10. [yum] yum将软件安装到指定的目录