【宫水三叶的刷题日记】209. 长度最小的子数组(中等)
题目描述
这是 LeetCode 上的 209. 长度最小的子数组 ,难度为 中等。
Tag : 「前缀和」、「二分」
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 ,并返回其长度。如果不存在符合条件的子数组,返回 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
提示:
前缀和 + 二分
利用 的数据范围为 ,可知前缀和数组满足「单调递增」。
我们先预处理出前缀和数组 sum
(前缀和数组下标默认从 开始),对于每个 而言,假设其对应的前缀和值为 ,我们将 视为子数组的右端点,问题转换为:在前缀和数组下标 范围内找到满足 值小于等于 的最大下标,充当子数组左端点的前一个值。
利用前缀和数组的「单调递增」(即具有二段性),该操作可使用「二分」来做。
代码:
class Solution { public int minSubArrayLen(int t, int[] nums) { int n = nums.length, ans = n + 10; int[] sum = new int[n + 10]; for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + nums[i - 1]; for (int i = 1; i <= n; i++) { int s = sum[i], d = s - t; int l = 0, r = i; while (l < r) { int mid = l + r + 1 >> 1; if (sum[mid] <= d) l = mid; else r = mid - 1; } if (sum[r] <= d) ans = Math.min(ans, i - r); } return ans == n + 10 ? 0 : ans; }}
时间复杂度:预处理前缀和数组的复杂度为 ,遍历前缀和数组统计答案复杂度为 。整体复杂度为
空间复杂度:
最后
这是我们「刷穿 LeetCode」系列文章的第 No.209
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
本文由 mdnice 多平台发布
【宫水三叶的刷题日记】209. 长度最小的子数组(中等)相关推荐
- 【宫水三叶的刷题日记】961. 在长度 2N 的数组中找出重复 N 次的元素
题目描述 这是 LeetCode 上的 961. 在长度 2N 的数组中找出重复 N 次的元素 ,难度为 简单. Tag : 「模拟」.「计数」.「构造」.「哈希表」 给你一个整数数组 nums ,该 ...
- 【宫水三叶的刷题日记】1022. 从根到叶的二进制数之和
题目描述 这是 LeetCode 上的 1022. 从根到叶的二进制数之和 ,难度为 简单. Tag : 「DFS」.「BFS」.「二叉树」.「树的遍历」 给出一棵二叉树,其上每个结点的值都是 或 ...
- 【宫水三叶的刷题日记】1037. 有效的回旋镖(简单)
题目描述 这是 LeetCode 上的 1037. 有效的回旋镖 ,难度为 简单. Tag : 「计算几何」.「数学」 给定一个数组 points,其中 表示 X-Y 平面上的一个点,如果这些点构 ...
- 【宫水三叶的刷题日记】497. 非重叠矩形中的随机点(中等)
题目描述 这是 LeetCode 上的 497. 非重叠矩形中的随机点 ,难度为 中等. Tag : 「前缀和」.「二分」.「随机化」 给定一个由非重叠的轴对齐矩形的数组 rects,其中 表示 是第 ...
- 【宫水三叶的刷题日记】732. 我的日程安排表 III
题目描述 这是 LeetCode 上的 「732. 我的日程安排表 III」 ,难度为 「困难」. Tag : 「线段树(动态开点)」.「分块」.「线段树」 当 个日程安排有一些时间上的交叉时(例如 ...
- 【宫水三叶的刷题日记】715. Range 模块
题目描述 这是 LeetCode 上的 715. Range 模块 ,难度为 困难. Tag : 「线段树」.「线段树(动态开点)」 Range 模块是跟踪数字范围的模块.设计一个数据结构来跟踪表示为 ...
- 【宫水三叶的刷题日记】730. 统计不同回文子序列(困难)
题目描述 这是 LeetCode 上的 730. 统计不同回文子序列 ,难度为 困难. Tag : 「区间 DP」.「动态规划」 给定一个字符串 s,返回 s 中不同的非空「回文子序列」个数 . 通过 ...
- 【宫水三叶的刷题日记】508. 出现次数最多的子树元素和
题目描述 这是 LeetCode 上的 508. 出现次数最多的子树元素和 ,难度为 中等. Tag : 「树的遍历」.「DFS」.「哈希表」 给你一个二叉树的根结点 root,请返回出现次数最多的子 ...
- 【宫水三叶的刷题日记】468. 验证IP地址
题目描述 这是 LeetCode 上的 468. 验证IP地址 ,难度为 中等. Tag : 「模拟」.「双指针」 给定一个字符串 queryIP.如果是有效的 IPv4 地址,返回 "IP ...
最新文章
- PrestaShop 网站后台配置(三)
- hp designiet 500_2020年HP学院壁纸
- 前端学习(1612):oracle简介
- 聊聊Spring Cloud版本的那些事儿
- vue和java bean_Java:JavaBean和BeanUtils
- 时间格式 asp.net
- 实习踩坑之路:Mybatis写的sql语句有<符号的问题导致项目启动失败以及count(*)怎么对应到某个实体类的字段
- 《那些年啊,那些事——一个程序员的奋斗史》三
- ibm arm-linux,CentOS Linux 7.5 (build 1804) 现可用于IBM POWER9体系结构
- C++语言的表达式模板:表达式模板的入门性介绍
- 努比亚 Z17s (Nubia NX595J) 解锁BootLoader 并刷入recovery ROOT
- 研究遭质疑!Jeff Dean回应:我们本就不是为得到新SOTA,成本计算也搞错了...
- 美国卡内基梅隆大学计算机科学生源质量,卡内基梅隆大学2020新生数据,计算机学院录取率堪比藤校!...
- spring和jump区别_JUMP与 SKIP 的区别
- rrd文件导入mysql_RRDtool 系列连载-5 :查询 RRD 数据库信息
- 关键词百度指数叠加-关键词百度指数叠加
- 基于FPGA的图像浮雕效果实现
- 你的声音价值百万,教你六个利用声音赚钱的方法
- 墨水屏(电子纸)的介绍与使用(附STM32程序~~~)
- ubuntu12.04宽带链接 以及 宽带链接后 再上局域网时出现的问题