目录
题目及链接
原题链接:力扣
滑动窗口算法
为了求最长无重复字符串的,在这里我们可以用滑动窗口算法,这个在各大笔试面试中考到的频率还是比较高的,那么什么是滑动窗口算法,我们以这道题为例,来对该算法进行详细的讲解,首先我们应该明白,其实这道题我们可以利用双指针进行判定,我们可以选择一个位置,把这个位置的值和出现的次数,用unorded_map记录下来,当遍历到下一个值的时候,我们先把其插入到我们的unordered_map中,然后通过映射来看它这个位置的值的次数,如果其出现次数大于1,那么我们就从开头开始把数据移除(推动窗口),直到移除到重复的字符的下标位置,然后记录当前长度(注意,当前长度就是最大以i下标最为结束的最大无重复字符串的长度),然后更新最大值即可。
算法优化
在这里,如果想要优化这个算法,其实最主要的是依靠单调性来进行优化,我们在这里可以做一步判定,i向某一位置的下一个位置移动时位置的时候,j可不能能在原来j的左边?
如果i'和j'之间的字符串是无重复的,那么i和j就不是最大的字串,和我们前面是矛盾的,那么j就不可能出现在之前位置的左边,这样我们下一次出现的时候直接从当前位置往后加即可,减少了一定的时间复杂度,算法就得到了优化。
代码实现
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map <char,int> heap;
int ans =0;
for(int i =0,j=0;i<s.size();i++)
{
heap[s[i]]++;
while(heap[s[i]]>1) heap[s[j++]]--;
int len =i-j+1;
ans =max(ans,len);
}
return ans;
}
};
类似题目
完全相同的原理,不过多解释了,直接上代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int ans =INT_MAX;
int sum =0;
for(int i =0,j=0;i<nums.size();i++)
{
sum+=nums[i];
while(sum-nums[j]>=target){
sum-=nums[j++];
}
if(sum>=target) {
int len =i-j+1;
ans=min(ans,len);
}
}
if (ans ==INT_MAX) return 0;
return ans;
}
};