209 长度最小的子数组(前缀和+二分查找、滑动窗口)
1. 问题描述:
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
进阶:
- 如果你已经完成了 O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。
2. 思路分析:
① 因为需要在一个区间中找到和大于等于s的最小长度,所以这个是属于区间和的问题,所以一开始的想到的是使用前缀和的方法去解决,我们可以先遍历一遍数组,并且记录[0:i]区间的前缀和(0 <= i < len(nums)),然后枚举长度为1,2...k的区间和,检查是否大于等于s,假如找到了那么直接返回就可以了,但是提交上去超时了,因为在检查长度的时候需要检查每一个对应长度的区间,检查的时间复杂度就为O(n ^ 2)
② 官方的题解提供了两种可行的方法,第一种方法是前缀和 + 二分查找,第二种方法是滑动窗口,其中比较好理解的是滑动窗口的解法,下面是我自己的理解:
对于第一种方法,与①中方法类似也是使用的前缀和的方法但是不是漫无目的的枚举每一个长度为l的区间上的和,这里使用二分查找可能满足条件的区间,我们枚举的区间是[0:len(nums)],[1:len(nums)],[2:len(nums)],这样可以避免一些不必要的区间的搜索,这也是在代码中在二分查找的时候需要先加上当前位置前缀和的值的目的,这样在二分查找的时候可以每一次都是在上一次查找的长度减1的前提下去查找
③ 第二种方法是滑动窗口的思路,一开始的时候竟然没有想到,我们需要找到一个区间和大于等于的s的最小长度,可以先从索引为0的这个位置开始找,然后找到和大于等于s的这个位置,这个时候可以让左边界向右扩大一点看区间和是否还是大于s,假如满足和大于等于s的时候更新最小长度,当发现左边界向右扩大之后和小于了s,这个时候就需要往右扩大右边界了,整个过程就是扩大与缩小窗口的过程,思路还是挺好理解的
3. 代码如下:
官方的前缀和+二分查找解法:
class Solution:def minSubArrayLen(self, s: int, nums: List[int]) -> int:if not nums:return 0n = len(nums)ans = n + 1sums = [0]for i in range(n):sums.append(sums[-1] + nums[i])for i in range(1, n + 1):target = s + sums[i - 1]bound = bisect.bisect_left(sums, target)if bound != len(sums):ans = min(ans, bound - (i - 1))return 0 if ans == n + 1 else ans
滑动窗口解法:
class Solution:def minSubArrayLen(self, s: int, nums: List[int]) -> int:if not nums:return 0n = len(nums)ans = n + 1start, end = 0, 0total = 0while end < n:total += nums[end]while total >= s:ans = min(ans, end - start + 1)total -= nums[start]start += 1end += 1return 0 if ans == n + 1 else ans
209 长度最小的子数组(前缀和+二分查找、滑动窗口)相关推荐
- 10. Leetcode 209. 长度最小的子数组 (数组-同向双指针-滑动窗口)
给定一个含有 n 个正整数的数组和一个正整数 target .找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr ...
- 209. 长度最小的子数组(中等 数组 滑动窗口)
209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, -, n ...
- 代码随想录算法训练营第二天|LeetCode 977.有序数组的平方 、209.长度最小的子数组 、59.螺旋矩阵II
LeetCode 977.有序数组的平方 题目链接:977.有序数组的平方 思路: 1.先对每个数进行遍历平方,并插入新的容器中 2.对容器进行排序,返回就可以了 缺陷:开辟了新的容器空间 class ...
- 【宫水三叶的刷题日记】209. 长度最小的子数组(中等)
题目描述 这是 LeetCode 上的 209. 长度最小的子数组 ,难度为 中等. Tag : 「前缀和」.「二分」 给定一个含有 n 个正整数的数组和一个正整数 target. 找出该数组中满足其 ...
- LeetCode 209. 长度最小的子数组 (滑动窗口)
LeetCode 209. 长度最小的子数组 class Solution {public int minSubArrayLen(int s, int[] nums) {int start = 0;i ...
- 代码随想录算法训练营第二天 | LeetCode977有序数组的平方 、209长度最小的子数组、 59.螺旋矩阵II
--------------------------- 977.有序数组的平方 #include <iostream> #include <algorithm> #includ ...
- Leetcode 209. 长度最小的子数组 解题思路及C++实现
解题思路: 定义两个指针 left 和 right,构成一个滑动窗口,当窗口内的数值和小于 s 时,右指针向右滑动,当窗口内的数值和大于等于 s 时,就要更新一次 子数组的最小长度了.同时 左指针向右 ...
- LeetCode 209. 长度最小的子数组(滑动窗口)
1. 题目 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组. 如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, num ...
- LeetCode 209. 长度最小的子数组(双指针+滑动窗口)
题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums ...
最新文章
- JQuery Easy Ui 可装载组合框 - ComboBox
- mysql 单表多字段查询_单表多字段MySQL模糊查询的实现
- 【深度学习】面向医学图像的病灶分割调研(一)
- kali linux wifi监听模式,无线渗透教程1:监听无线网络
- Taro+react开发(16)--跳转拿参
- 基于SpringBoot 2.0正式版的SpringCloud的微服务实战项目搭建
- 诗与远方:无题(四十一)
- (68)FPGA模块调用(Verilog调用VHDL)
- python中matplotlib库饼图_python 使用 matplotlib.pyplot来画柱状图和饼图
- linux下gdb调试查看源代码
- 输入一个整数,计算它各位上数字的和。(注意:是任意位的整数)
- chariot iperf使用_iperf局域网性能工具
- SpringBoot解决XSS跨站脚本攻击
- 图解 FAT 文件系统基础知识
- java 判断 string null_java 字符串为null 如何判断
- WebGL/ThreeJS项目结构介绍2-创建地板并贴图
- 班级网站java,ssm班级网站
- android CircleIndicator 实现引导页
- flv实现视频实时监控
- 2022年5月26日:用C#生成.NET应用程序--创建新的.NET项目并使用依赖项(部分没看懂。)
热门文章
- Kinross信荣基金 小心“馅饼”变“陷阱”
- android 截屏 效率,手机知识大科普!效率神器!华为手机这几种截屏方式你知道吗?...
- 英灵神殿修改服务器名字吗,《Valheim英灵神殿》服务器彩色名称设置教程及常见服务器问题讲解...
- JS数组遍历的效率比较
- 转:小米互联网音箱升级“小爱同学”变砖?教你一招满血复活!
- Python wordcloud 库 自学2
- IntelliJ IDEA for Mac如何添加jar包/如何导入jar包/导包
- 推荐《第一本经济学》
- adc去质器什么意思_ADC后期伤害爆炸?这几个英雄轻松制裁,ADC去质器了解一下...
- 【独立版】快抖云推V1.4.1全插件牛气霸屏,修复视频直推发布失败问题