题目一:
代码如下:
int minSubArrayLen(int target, vector<int>& nums)
{
int n = nums.size();
int left = 0;
int right = 0;
int sum = 0;
int len = INT_MAX;
while (right < n)
{
//进窗口
sum += nums[right];
while (sum >= target)
{
len = min(len, right - left + 1);
sum -= nums[left++];
}
right++;
}
return len == INT_MAX ? 0 : len;
}
思路整理:运用滑动窗口的思想(同向双指针),不断找到符合条件的序列并更新结果,最终返回最终结果即可。
思路整理以及变量说明:
<1>left作为“滑动窗口”的左端点,right作为“滑动窗口”的右端点,sum记录序列和,len表示最终结果。
<2>进窗口,其实就是将right位置的值加到sum上,出窗口,如果sum >= target,那么就要出窗口了,出窗口其实就是将left位置的值从sum中减去,注意出窗口之前,要将符合条件的序列长度进行更新。
<3>right遍历整个序列即可。
<4>如果没有符合条件的,就返回0,否则返回len作为最终结果。
题目二:
代码如下:
int lengthOfLongestSubstring(string s)
{
int n = s.size();
unordered_map<char, int> hash;
int left = 0;
int right = 0;
int len = -INT_MAX;
while (right < n)
{
//进窗口
hash[s[right]]++;
//出窗口
while (hash[s[right]] > 1)
{
hash[s[left]]--;
left++;
}
len = max(len, right - left + 1);
right++;
}
return len == -INT_MAX ? 0 : len;
}
思路整理:运用滑动窗口的思想,结合数据结构哈希表,建立字符和出现个数的映射,在符合条件时更新结果即可。
具体逻辑以及变量解释:
<1>left指向“滑动窗口”的左边界,right指向“滑动窗口”的右边界,len表示最终返回的结果。
<2>进窗口,即哈希表中right对应位置的字符次数+1,然后判断是否出窗口,即right位置的字符的次数是否大于1(是否重复),如果重复,那么就要从滑动窗口的左边界开始,逐渐删去哈希表中左边界对应位置的字符(次数-1),直到整个滑动窗口内没有重复字符为止,此时就可以进行结果的更新,因为此时滑动窗口内的内容是合法的(没有重复字符)。
<3>如果没有符合条件的就返回0(为空的情况),否则就返回len即可。