优选算法第二讲:滑动窗口模块
对于算法的实现,只是根据自己的情况来写的解释,可能比较含糊
1.长度最小的子数组
链接: link
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
//创建一个双指针,当rigth越界时结束循环
int sum = 0, ret = INT_MAX;
for(int left = 0, right= 0; right < nums.size(); right++)
{
sum += nums[right];//进窗口
while(sum >= target) ret=min(ret, right-left+1),sum-=nums[left++];
}
return ret == INT_MAX ? 0 : ret;
}
};
2.无重复字符的最长子串
链接: link
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//对于重复字符的判断方法,我们可以使用数组的方式
int hash[128] = {
0};
//创建双指针
int ret = 0;
for(int left = 0, right = 0; right<s.size(); right++)
{
//进入窗口
hash[s[right]] += 1;
if(hash[s[right]] > 1)//判断是否是重复字符
{
while(s[left] != s[right]) hash[s[left++]] -= 1;
hash[s[left++]] -= 1;
}
//更新数据
ret = max(ret, right-left+1);
}
return ret;
}
};
3.最大连续1的个数III
链接: link
class Solution {
public:
int longestOnes(vector<int