长度最小的子数组,无重复字符的最长子串

题目一:

代码如下:

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即可。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值