目录
209. 长度最小的子数组
解析
题解
3. 无重复字符的最长子串
解析
题解
1004. 最大连续1的个数 III
解析
题解
209. 长度最小的子数组
209. 长度最小的子数组 - 力扣(LeetCode)
解析
题解
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
// 009_专题二_滑动窗口_长度最小的子数组_C++
int left = 0, right = 0, n = nums.size(), sum = 0, len = INT_MAX;
while (right < n) {
sum += nums[right]; // 进窗口
while (sum >= target) // 判断
{
len = min(len, right - left + 1); // 更新结果
sum -= nums[left];
left++; // 出窗口
}
right++;
}
return len == INT_MAX ? 0 : len;
}
};
3. 无重复字符的最长子串
3. 无重复字符的最长子串 - 力扣(LeetCode)
解析
题解
class Solution {
public:
int lengthOfLongestSubstring(string s) {
// 010_专题二_滑动窗口_无重复字符的最长子串_C++
int hash[128] = {0};
int n = s.size(), len = 0;
for (int left = 0, right = 0; right < n; ++right) {
hash[s[right]]++; // 进窗口
while (hash[s[right]] == 2) // 判断
{
hash[s[left]]--; // 出窗口
left++;
}
len = max(len, right - left + 1); // 出窗口之后再更新结果
}
return len;
}
};
1004. 最大连续1的个数 III
1004. 最大连续1的个数 III - 力扣(LeetCode)
解析
题解
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
// 011_专题二_滑动窗口_最大连续 1 的个数III_C++
// 转化为:找出最长的子数组,0的个数不少于k
int n = nums.size(), len = INT_MIN;
for (int left = 0, right = 0, zero = 0; right < n; ++right) {
if (nums[right] == 0)
zero++; // 进窗口
while (zero > k) // 判断
{
if (nums[left] == 0)
zero--;
left++; // 向后移动
}
len = max(len, right - left + 1); // 更新结果
}
return len;
}
};