【leetcode】644 最大子段和 II(二分查找,数组)
题目链接: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 <= k <= n <= 10,000。
- 数组中的元素范围是 [-10,000, 10,000]。
- 答案的计算误差小于 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(二分查找,数组)相关推荐
- [Golang]力扣Leetcode - 374. 猜数字大小(二分查找)
[Golang]力扣Leetcode - 374. 猜数字大小(二分查找) 题目:猜数字游戏的规则如下: 每轮游戏,我都会从 1 到 n 随机选择一个数字. 请你猜选出的是哪个数字. 如果你猜错了,我 ...
- LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根
LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根 题目描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型 ...
- C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组
C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在 ...
- LeetCode 900. RLE 迭代器(模拟/二分查找)
文章目录 1. 题目 2. 解题 2.1 直接模拟 2.2 二分查找 1. 题目 编写一个遍历游程编码序列的迭代器. 迭代器由 RLEIterator(int[] A) 初始化,其中 A 是某个序列的 ...
- LeetCode 374. 猜数字大小(二分查找)
1. 题目 我们正在玩一个猜数字游戏. 游戏规则如下: 我从 1 到 n 选择一个数字. 你需要猜我选择了哪个数字. 每次你猜错了,我会告诉你这个数字是大了还是小了. 你调用一个预先定义好的接口 gu ...
- LeetCode 392. 判断子序列(双指针二分查找)
1. 题目 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 ...
- LeetCode 475. 供暖器(双指针二分查找)
文章目录 1. 题目 2. 解题 2.1 双指针 2. 二分查找 1. 题目 冬季已经来临. 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖. 现在,给出位于一条水平线上的房屋和供暖器的位置, ...
- LeetCode 50. Pow(x, n)(二分查找)
文章目录 1. 题目 2. 二分查找 2.1 递归 2.2 循环 1. 题目 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 示例 输入: 2.00000, 10 输出: 1024.000 ...
- LeetCode 69. x 的平方根(二分查找)
文章目录 1. 题目 2.解题 2.1 二分查找 2.2 牛顿迭代 1. 题目 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果 ...
最新文章
- IBM拓展云数据分析服务 用户来“做主”
- 正则表达式限制文本框只能输入数字,小数点,英文字母,汉字
- SpringBoot整合MyBatis-Plus3.1详细教程
- 使用git了解代码编写过程
- layui添加复选框_对layui初始化列表的CheckBox属性详解,初始化属性
- Oracle 备份与还原
- MySQL03:DML语言
- ORA-01810格式代码出现两次 的解决方案
- 关于缩短编写代码数据花费时间的问题
- Python高级专题 - 类型转换的魔术方法
- Android (AMS)ActivityManagerService源码分析
- Sentinel限流实战
- Java web 实现视频在线播放的常用几种方法
- 【转】复制网页内容三招
- 3.3V和1.8V电平双向转换——电平转换芯片
- “大众摄影”“北外亚非学院”等网站被挂马
- Mac关闭fn切换输入法功能
- Android账号管理系统详解
- jupyter notebook出现DLL load failed while importing _multiarray_umath: 找不到指定的模块
- python文件下载战_在您的Python平台游戏中放一些战利品