【LeetCode滑动窗口算法】长度最小的子数组 难度:中等

我们先看一下题目描述:

解法一:暴力枚举

时间复杂度:o(n^3)

cpp 复制代码
class Solution {
public:
	int minSubArrayLen(int target, vector<int>& nums)
	{
		int i = 0, j = 0;
		vector<int> v;
		for (;i < nums.size();i++)
		{
			int sum = nums[i];
			for (j = i + 1;j < nums.size();j++)
			{
				sum = sum + nums[j];
				if (target == sum)
				{
					v.push_back(j - i + 1);//j-i+1就是满足条件的子数组的长度
					break;
				}
			}
		}
		sort(v.begin(), v.end());
		if (v.empty())
			return 0;
		else
			return v[0];
	}
};

解法2:利用数组元素的单调性,滑动窗口(同向双指针)算法。

时间复杂度: o(n)

滑动窗口怎么用呢?

1、left=0,right=0

2、进窗口-->判断是否满足条件-->否-->进窗口

是-->更新结果-->出窗口-->更新结果

滑动窗口算法主要是利用数组元素之和的单调性,规避了很多没有必要的枚举行为。

下面是滑动窗口算法的演示:

下面我们来实现一下基于滑动窗口算法的解题代码:

cpp 复制代码
class Solution {
public:
	int minSubArrayLen(int target, vector<int>& nums)
	{
		int sum = 0, len = INT_MAX;
		for (int left = 0, right = 0;right < nums.size();right++)
		{
			sum += nums[right];//进入窗口
			while (sum >= target)//判断
			{
				len = min(len, right - left + 1);//更新结果
				sum -= nums[left++];//出窗口
			}
		}
		return len == INT_MAX ? 0 : len;
	}
};
相关推荐
heimeiyingwang9 天前
【深度学习加速探秘】Winograd 卷积算法:让计算效率 “飞” 起来
人工智能·深度学习·算法
LyaJpunov9 天前
深入理解 C++ volatile 与 atomic:五大用法解析 + 六大高频考点
c++·面试·volatile·atomic
小灰灰搞电子9 天前
Qt PyQt与PySide技术-C++库的Python绑定
c++·qt·pyqt
时空自由民.9 天前
C++ 不同线程之间传值
开发语言·c++·算法
ai小鬼头9 天前
AIStarter开发者熊哥分享|低成本部署AI项目的实战经验
后端·算法·架构
小白菜3336669 天前
DAY 37 早停策略和模型权重的保存
人工智能·深度学习·算法
zeroporn9 天前
以玄幻小说方式打开深度学习词嵌入算法!! 使用Skip-gram来完成 Word2Vec 词嵌入(Embedding)
人工智能·深度学习·算法·自然语言处理·embedding·word2vec·skip-gram
Ray_19979 天前
C++二级指针的用法指向指针的指针(多级间接寻址)
开发语言·jvm·c++
亮亮爱刷题9 天前
飞往大厂梦之算法提升-7
数据结构·算法·leetcode·动态规划
_周游9 天前
【数据结构】_二叉树OJ第二弹(返回数组的遍历专题)
数据结构·算法