滑动窗口
固定滑动窗口的一端,遍历另一端。
LeetCode209. 长度最小的子数组
题目描述:给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
链接:https://leetcode.cn/problems/minimum-size-subarray-sum
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
//滑动窗口
//遍历滑动窗口的结束位置,每次更新起始位置(在while中同时更新起始与结束位置容易出错)
int left = 0;
int ans = INT_MAX;
int sum = 0;
for (int right = 0; right < nums.size(); right++) {
sum += nums[right];
while (sum >= target) { //如果当前和大于target,则左移起始位置
ans = ans < right - left + 1 ? ans : right - left + 1;
sum -= nums[left];
left++;
}
}
return ans == INT_MAX ? 0 : ans;
}
};
剑指Offer Ⅱ 016. 不含重复字符的最长子字符串
题目描述:给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。
链接:https://leetcode.cn/problems/wtcaE1
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//滑动窗口
int maxLength = 0;
int right = 1;
unordered_set<char> st;
st.insert(s[0]);
for (int left = 0; left < s.size(); left++) {
if (left != 0) st.erase(s[left - 1]);
while (right < s.size() && st.find(s[right]) == st.end()) {
st.insert(s[right]);
right++;
}
maxLength = maxLength > right - left ? maxLength : right - left;
}
return maxLength;
}
};