所有算法文章链接(最底部)
目录
算法讲解
看到一道题如何想到滑动窗口
如果这道题的暴力解法可以被同向的双指针(两个指针同时向后走)所优化,第一时间就要想到滑动窗口。
步骤:
1.进窗口
2.判断
3.根据判断出窗口
4.更新结果(位置不固定,可能在出窗口之前更新,也可能之后)
1.长度最小子数组
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
解题思路
1.用left,right两个指针维护一个窗口
2.right向后遍历,把right指向的元素加到sum(进窗口)
3.如果窗口的和sum>=targert出窗口(判断)
4.把left指向的元素从sum中减出去(出窗口)
代码编写
int minSubArrayLen(int target, vector<int>& nums)
{
int n = nums.size(), sum = 0, len = INT_MAX;
for(int left = 0, right = 0; right < n; right++)
{
sum += nums[right]; // 进窗⼝
while(sum >= target) // 判断
{
len = min(len, right - left + 1); // 更新结果
sum -= nums[left++]; // 出窗⼝
}
}
return len == INT_MAX ? 0 : len;
}
2.无重复最长字串
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
解题思路
1.left,right两个指针维护一个窗口
2.将right的指向的元素加入哈希表中(进窗口)
3.right指向的元素在哈希表中是否出现
4.判断为真 ,将left指向的元素从哈希表中删除,直到重复的元素出现次数为一。
代码编写
int lengthOfLongestSubstring(string s)
{
int hash[128] = { 0 }; // 使⽤数组来模拟哈希表
int left = 0, right = 0, n = s.size();
int ret = 0;
while(right < n)
{
hash[s[right]]++; // 进⼊窗⼝
while(hash[s[right]] > 1) // 判断
hash[s[left++]]--; // 出窗⼝
ret = max(ret, right - left + 1); // 更新结果
right++; // 让下⼀个元素进⼊窗⼝
}
return ret;
}