题目链接:https://leetcode-cn.com/problems/maximum-average-subarray-ii/

题目描述

给定一个包含 n 个整数的数组,找到最大平均值的连续子序列,且长度大于等于 k。并输出这个最大平均值。

样例 1:

输入: [1,12,-5,-6,50,3], k = 4
输出: 12.75
解释:
当长度为 5 的时候,最大平均值是 10.8,
当长度为 6 的时候,最大平均值是 9.16667。
所以返回值是 12.75。

注释 :

  1. 1 <= k <= n <= 10,000。
  2. 数组中的元素范围是 [-10,000, 10,000]。
  3. 答案的计算误差小于 10-5 。

思路

用二分法查找平均值x,对于每个x去检查是否有子数组的平均值大于x
二分查找时间复杂度O(log(max-min))
查找子数组线性时间复杂度O(n)

二分法

/** O(nlog(max-min))*/
class Solution {public:double findMaxAverage(vector<int>& nums, int k) {if(nums.size() < k) return false;double maxVal = DBL_MIN;double minVal = DBL_MAX;// 寻找最值for (double n:nums){maxVal = max(maxVal, n);minVal = min(minVal, n);}double err = 1e-5;// 用二分法查找平均值x,对于每个x去检查是否有子数组的平均值大于xwhile (maxVal - minVal > err){double mid = (maxVal + minVal) /2.0;if(check(nums, mid, k))minVal = mid;elsemaxVal = mid;}return maxVal;}private:// 判断数组内是否有一段长度大于等于k的子数组,满足均值大于key// 只需利用当前累加和,减去当前最小累加和即可判断// 时间复杂度O(n)bool check(vector<int>&nums, double key, int k){double sum = 0, prev = 0, minSum = 0;for (int i = 0; i < k; ++i)sum += nums[i] - key;if(sum >=0)return true;for (int i = k; i < nums.size(); ++i) {sum += nums[i] - key;prev += nums[i-k] - key;minSum = min(prev, minSum);if(sum >= minSum)return true;}return false;}
};

【leetcode】644 最大子段和 II(二分查找,数组)相关推荐

  1. [Golang]力扣Leetcode - 374. 猜数字大小(二分查找)

    [Golang]力扣Leetcode - 374. 猜数字大小(二分查找) 题目:猜数字游戏的规则如下: 每轮游戏,我都会从 1 到 n 随机选择一个数字. 请你猜选出的是哪个数字. 如果你猜错了,我 ...

  2. LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根

    LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根 题目描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型 ...

  3. C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组

    C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在 ...

  4. LeetCode 900. RLE 迭代器(模拟/二分查找)

    文章目录 1. 题目 2. 解题 2.1 直接模拟 2.2 二分查找 1. 题目 编写一个遍历游程编码序列的迭代器. 迭代器由 RLEIterator(int[] A) 初始化,其中 A 是某个序列的 ...

  5. LeetCode 374. 猜数字大小(二分查找)

    1. 题目 我们正在玩一个猜数字游戏. 游戏规则如下: 我从 1 到 n 选择一个数字. 你需要猜我选择了哪个数字. 每次你猜错了,我会告诉你这个数字是大了还是小了. 你调用一个预先定义好的接口 gu ...

  6. LeetCode 392. 判断子序列(双指针二分查找)

    1. 题目 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 ...

  7. LeetCode 475. 供暖器(双指针二分查找)

    文章目录 1. 题目 2. 解题 2.1 双指针 2. 二分查找 1. 题目 冬季已经来临. 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖. 现在,给出位于一条水平线上的房屋和供暖器的位置, ...

  8. LeetCode 50. Pow(x, n)(二分查找)

    文章目录 1. 题目 2. 二分查找 2.1 递归 2.2 循环 1. 题目 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 示例 输入: 2.00000, 10 输出: 1024.000 ...

  9. LeetCode 69. x 的平方根(二分查找)

    文章目录 1. 题目 2.解题 2.1 二分查找 2.2 牛顿迭代 1. 题目 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果 ...

最新文章

  1. IBM拓展云数据分析服务 用户来“做主”
  2. 正则表达式限制文本框只能输入数字,小数点,英文字母,汉字
  3. SpringBoot整合MyBatis-Plus3.1详细教程
  4. 使用git了解代码编写过程
  5. layui添加复选框_对layui初始化列表的CheckBox属性详解,初始化属性
  6. Oracle 备份与还原
  7. MySQL03:DML语言
  8. ORA-01810格式代码出现两次 的解决方案
  9. 关于缩短编写代码数据花费时间的问题
  10. Python高级专题 - 类型转换的魔术方法
  11. Android (AMS)ActivityManagerService源码分析
  12. Sentinel限流实战
  13. Java web 实现视频在线播放的常用几种方法
  14. 【转】复制网页内容三招
  15. 3.3V和1.8V电平双向转换——电平转换芯片
  16. “大众摄影”“北外亚非学院”等网站被挂马
  17. Mac关闭fn切换输入法功能
  18. Android账号管理系统详解
  19. jupyter notebook出现DLL load failed while importing _multiarray_umath: 找不到指定的模块
  20. python文件下载战_在您的Python平台游戏中放一些战利品

热门文章

  1. 【PS】61款中国风古典背景水墨山水古风韵味PSD分层设计素材
  2. append()方法
  3. $nextTick 是干什么的
  4. 【工作需要】CAD+VBA 实现图块的旋转平移缩放和拼接
  5. 论文中可以让代码变得非常好看的工具
  6. 【数据结构】广义表的存储结构及基本运算(C语言)
  7. 谱本征正交分解 (SPOD)附matlab代码
  8. Python3 - k8s之深入理解 Pod
  9. WebGoat v8.1.0 下载安装(windows)
  10. frame组件+pack()来布局定位组件,实例讲解