⭐算法入门⭐《双指针》中等03 —— LeetCode 209. 长度最小的子数组
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《双指针》中等03 —— LeetCode 209. 长度最小的子数组相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
C语言免费动漫教程,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?先看简单题! 🧡《C语言入门100例》🧡
数据结构难?不存在的! 🌳《画解数据结构》🌳
闭关刷 LeetCode,剑指大厂Offer! 🌌《LeetCode 刷题指引》🌌
LeetCode 太简单?算法学起来! 💜《夜深人静写算法》💜
一、题目
1、题目描述
给定一个含有 n n n 个正整数的数组和一个正整数 t a r g e t target target。找出该数组中满足其和
≥ target
的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0 。
样例输入:target = 7, nums = [2,3,1,2,4,3]
样例输出:2
2、基础框架
- C语言 版本给出的基础框架代码如下:
int minSubArrayLen(int target, int* nums, int numsSize){
}
3、原题链接
二、解题报告
1、思路分析
双指针
2、时间复杂度
- 一个两个指针,都只会增加不会减少,所以总的时间复杂度为 O ( n ) O(n) O(n)。
3、代码详解
const int maxn = 1000000;
int minSubArrayLen(int target, int* nums, int numsSize){
int i = 0, j = -1; // (1)
int sum = 0; // (2)
int len = maxn; // (3)
while(++j < numsSize) { // (4)
sum += nums[j];
while(sum >= target) {
if((j - i + 1) && j - i + 1 < len) { // (5)
len = j - i + 1;
}
sum -= nums[i++]; // (6)
if(i > j) { // (7)
break;
}
}
return (len == maxn) ? 0 : len;
}
- ( 1 ) (1) (1) 这表示一开始是从一个空数组开始;
-
(
2
)
(2)
(2)
sum
永远等于nums[i:j]
的和,利用 O ( 1 ) O(1) O(1) 的时间更新; -
(
3
)
(3)
(3)
len
用于存储这个最短子数组的长度,默认为大于数组长度即可; - ( 4 ) (4) (4) 右指针必须在数组范围内;
- ( 5 ) (5) (5) 记录一个可行解;
- ( 6 ) (6) (6) 左区间右移,所以左边的元素需要去掉;
- ( 7 ) (7) (7) 又变回空串了跳出循环;
三、本题小知识
尺取法 可以用来解决问题单调性问题。
以上是关于⭐算法入门⭐《双指针》中等03 —— LeetCode 209. 长度最小的子数组的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《双指针》中等04 —— LeetCode 713. 乘积小于K的子数组