105.长度最小的子数组(力扣)|滑动窗口
2023-12-13 08:25:16
代码演示?
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT_MAX; // 用于存储最小子数组的长度
int sum = 0; // 滑动窗口的长度
int i = 0; // 滑动窗口的起始位置
int sumlength = 0; // 当前子数组的长度
// 遍历数组
for (int j = 0; j < nums.size(); j++) {
sum += nums[j]; // 扩展窗口
// 检查和是否大于等于目标值
while (sum >= target) {
sumlength = j - i + 1; // 计算当前子数组的长度
result = result < sumlength ? result : sumlength; // 更新最小长度
sum -= nums[i]; // 收缩窗口
i++; // 移动窗口的起始位置
}
}
return result == INT_MAX ? 0 : result;
}
};
思路
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
初始化:
result
初始化为INT_MAX
,用于存储最小子数组的长度。sum
是滑动窗口中元素的当前和。i
是滑动窗口的起始位置。sumlength
是当前子数组的长度。遍历数组:
- 外部循环 (
for (int j = 0; j < nums.size(); j++)
) 遍历数组的每个元素。sum += nums[j];
:将当前元素添加到滑动窗口的和中。检查和是否大于等于目标值:
- 如果
sum
变得大于或等于target
,表示当前窗口的和足够大。- 进入内部的
while
循环来收缩窗口。收缩窗口:
sumlength = j - i + 1;
:计算当前子数组的长度。result = result < sumlength ? result : sumlength;
:用目前的最小长度更新result
。sum -= nums[i];
:从和中减去起始位置的元素。i++;
:将窗口的起始位置向右移动。返回结果:
- 循环结束后,如果
result
已经被更新,则返回result
,否则返回 0。
文章来源:https://blog.csdn.net/weixin_63779802/article/details/134867370
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!