★ 算法OJ题 ★ 力扣209

发布时间:2025-06-24 16:51:50  作者:北方职教升学中心  阅读量:768


Ciallo~(∠・ω< )⌒☆ ~。 今日,简单做一个滑动窗算法题——长度最小的子数组~。

目录。

一  题目。

二  算法解析。

解法⼀:暴力求解。

解法二:滑动窗口。

三  编写算法。


一  题目。

209. 子数组长度最小 - 扣除(LeetCode)

二  算法解析。

解法⼀:暴力求解。

算法思路: 从前到后枚举。数组中的任何东西⼀元素,把它当作起始位置。然后从这个起始位置开始。寻找⼀段最短的区间。使这个范围的和大于等于目标值。。 以所有元素为起始位置的结果,找到最小值。即可。(会超时)

class Solution {public:	int minSubArrayLen(int target, vector<int>& nums)	{		// 记录结果		int ret = INT_MAX;		int n = nums.size();		// 枚举所有满⾜和⼤于等于 target 的⼦数组[start, end]		// 因为是得到最多⼩,因此,在枚举过程中,数组应尽可能多地进行⻓度最⼩		// 枚举开始位置		for (int start = 0; start < n; start++)		{			int sum = 0; // 从这个位置记录连续数组的和			// 寻找结束位置			for (int end = start; end < n; end++)			{				sum += nums[end]; // 添加当前位置				if (sum >= target) // 在这段时间内和满⾜条件时				{					// 更新结果󿀌start 开头的最短区间已经找到了					ret = min(ret, end - start + 1);					break;				}			}		}		// 返回最终结果		return ret == INT_MAX ? 0 : ret;	}};

这种方法可以通过以下两个优化,成为解法二:

解法二:滑动窗口。 0 : ret; }};

这种方法可以通过以下两个优化,成为解法二:

  • 解法二:滑动窗。滑动窗的好处。使用单调性,使用“同向双指针”优化,

避免许多不必要的枚举行为。

  • ~。什么时候使用滑动窗口?~。有。单调性。,有两个指针。

向同向移动,不回退。

  • 可以使用~。
  • 如何使用滑动窗?~。
  • 定义两个指针,left = 0, right = 0;
  • 进窗口。

判断(循环)更新结果出窗口。时间复杂度:尽管代码是两个循环,但是我们的 left 指针和 right 指针。都不回退。,两者最多都会向后移动 n 二次,任何指针最终都会结束。 。所以时间的复杂性是。

O(N)。

三  编写算法。class Solution {public: int minSubArrayLen(int target, vector<int>& nums) { int ret = INT_MAX, sum = 0; int n = nums.size(); for (int left = 0, right = 0; right < n; right++) { sum += nums[right]; // 进窗⼝ while(sum >= target) // 判断 { ret = min(ret, right - left + 1); // 更新结果 sum -= nums[left]; left++;// 出窗⼝ } } return ret == INT_MAX ? 0 : ret; }};