滑动窗口算法是一种用于解决子串或子数组问题的算法,其基本原理是通过维护一个滑动窗口来计算最长或最短的子串或子数组。
对于最长子数组问题,可以通过以下步骤实现:
定义两个指针left和right,分别表示滑动窗口的左右边界。
初始化left和right指针的位置,并记录当前最长子数组的长度。
移动right指针,直到滑动窗口内的元素满足条件。如果不满足条件,则移动left指针,并更新当前最长子数组的长度。
重复步骤3,直到right指针走到数组末尾。
以下是一个示例代码,通过滑动窗口算法求解一个数组中最长连续递增子序列的长度:
int findLengthOfLCIS(vector<int>& nums) {
int n = nums.size();
if(n <= 1) return n;
int left = 0, right = 1, maxLen = 1;
while(right < n) {
if(nums[right] > nums[right - 1]) { // 满足递增条件
maxLen = max(maxLen, right - left + 1);
} else {
left = right; // 更新left指针的位置
}
++right; // 更新right指针的位置
}
return maxLen;
}
对于最短子数组问题,可以通过以下步骤实现:
定义两个指针left和right,分别表示滑动窗口的左右边界。
初始化left和right指针的位置,并记录当前最短子数组的长度。
移动right指针,直到滑动窗口内的元素满足条件。如果不满足条件,则移动left指针,并更新当前最短子数组的长度。
重复步骤3,直到right指针走到数组末尾。
以下是一个示例代码,通过滑动窗口算法求解一个数组中和大于等于给定值的最短子数组的长度:
int minSubArrayLen(int s, vector<int>& nums) {
int n = nums.size();
if(n == 0) return 0;
int left = 0, right = 0, sum = 0, minLen = INT_MAX;
while(right < n) {
sum += nums[right]; // 累加元素
while(sum >= s) { // 满足条件
minLen = min(minLen, right - left + 1);
sum -= nums[left++]; // 移动left指针
}
++right; // 更新right指针的位置
}
return minLen == INT_MAX ? 0 : minLen;
}