您现在的位置是:初识算法 · 滑动窗(1) >>正文
初识算法 · 滑动窗(1)
德薄能鲜网71571人已围观
简介目录。 前言:子数组长度最小。题目解析。算法原理。算法编写。无重复长度的最小字符串。题目解析。算法原理。算法编写。 前言:本文开始介绍了滑动窗算法类型...
目录。
前言:
子数组长度最小。
题目解析。
算法原理。
算法编写。
无重复长度的最小字符串。
题目解析。
算法原理。
算法编写。
前言:
本文开始介绍了滑动窗算法类型的主题,本质上,滑动窗也是双指针,但是,前面介绍的双指针是相对移动的:
滑动窗是同向移动的:
本文通过两个主题介绍滑动窗的基本使用,主题分别是:
209. 子数组长度最小 - 扣除(LeetCode)
3. 无重复字符的最长子串 - 扣除(LeetCode)
三步介绍第一步是题目分析,第二步是算法原理,第三步是编写算法,同样的,问题分析部分会有暴力解决方案,所以不要说太多进入第一个题目。
子数组长度最小。
子数组长度最小。
题目分析。
主题的要求是,找到连续的范围,该区间的总值大于等于target,如果有这种范围,返回值应该是这些范围的最小长度。如果没有这样的子数组返回的应该是0。
然后是两个例子。所以我们能暴力解决这个问题吗?当然可以。
我们只需要找到所有符合这一条件的范围,并判断它们的长度,但如果时间复杂,,O(N^2)是肯定的,而且这个话题会超时,所以感兴趣的同学可以自己试试。
那为什么这个题目一眼就能用滑动窗口呢?f;因为需要一个连续的空间。
,作为经验要求是连续空间的话题,我们不妨靠在滑动窗上。
现在进入算法原理部分。
算法原理。
滑动窗的本质是,两个指针同向移动,通过这两个指针的移动,判断区间之和是否符合#xff0c;比较长度大小,如果满意。
那么如果使用滑动窗?
前两个指针的起点应该是一样的,如果两个指针的位置不一样,这将导致我们需要增加一个循环来寻求这个范围和,现在:
int left = 0, right = 0;
这是肯定的,然后滑动窗我们能记住两个名词,一个是进窗,一个是出口窗口,何时进入窗口?c;什么是窗口?c;这是我们的话题所关心的。窗口代表。
,区间之和<target,因此,需要更多的数字参与,这就是为什么我们不需要排序的原理,主题本身需要正整数,所以我们只需要确保数字越多。窗口代表。
,区间之和>target,判断出窗口中存在的最小长度。
这是的基本原理c;一进一出之间,能成功解决问题。
算法编写。
class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int ans = INT_MAX, left = 0, right = 0 ,sum = 0; for(;right < nums.size();right++) { sum += nums[right]; while(sum >= target) { ans = min(ans,right - left + 1);//如果ans是0 那么这一步永远是0 sum -= nums[left++]; } } return ans == INT_MAX ? 0 : ans; }};
但这个话题的恶心之处在于,如果最初的长度不定义为一个大数字,在判断比较时,最小数字不能通过min获得c;所以我们应该把ans定义为INT__MAX,只要是一个大数字就可以了。 0 : ans; }};
但这个话题的恶心之处在于,如果最初的长度不定义为一个大数字,在判断比较时,最小数字不能通过min获得c;所以我们应该把ans定义为INT__MAX,只是一个很大的数字。
到目前为止,题目分析完毕。
无重复长度的最小字符串。
题目解析。
题目很短通过条件是返回不含重复字符的最长字符串的长度,所以对于字符来说,,标题中给出的要求是:
因此,为了判断是否重复,我们需要一种方法来判断是否有映射,在这里,我们不妨使用哈希映射使用数组模仿哈希表,那么首当其冲的,我们不妨判断一下这个话题是否存在暴力解决方案。
那一定是存在的,我们使用两个for循环第二个循环找到最后一个元素,同时判断映射值是否大于1,直接返回大于1。时间的复杂性一定是O(N^2),是可以通过的。
但鉴于这个问题的本质是一个范围,所以我们不妨用滑动窗口来回答。算法原理。最后一个主题的滑动窗口是最小长度的子数组,判断条件大于或等于>=target,判断这个问题的条件是hash映射是否大于1,所以,得出结论,:
使用滑动窗口的标题,三部曲,第一个是进窗,二是判断,三是出窗。
。
以下问题都是非常死板的使用步骤。
所以我们的判断方法也是使用哈希映射,如果映射大于1,则判断出,记录对应的ans,或者映射符合条件,还可以记录相应的ans。
最终返回ans即可。
算法编写。
class Solution { public: int lengthOfLongestSubstring(string s) { int hash[256] = { 0 }, ans = 0; for(int left = 0, right = 0;right < s.size();right++) { hash[s[right]]++; while(hash[s[right]] > 1) { hash[s[left++]]--; } ans = max(ans,right - left + 1); } return ans; }};
滑动窗的开始就结束了~。感谢阅读!Tags:
相关文章
红米14C 4GB 64GB版4G手机老人机大音量简单操作备用机
初识算法 · 滑动窗(1)红米14C 4GB 64GB版4G手机,专为老年人设计的实用备用机,音量大,操作简单方便,满足日常通信需求。该手机配备了高效的性能配置,耐久性,适合需要稳定使用的用户。目前,在天猫精选优惠活动中,原价...
阅读更多
关卡编辑游戏什么好玩? 最新关卡编辑游戏排行榜的最新关卡
初识算法 · 滑动窗(1)探索游戏乐趣的巅峰:最新关卡编辑游戏排行榜揭示,创新、挑战、创作并存的杰作正引领潮流。战略构建者和创意专家都将在这里找到能够满足他们想象力和技能的宝藏。来看看,体验超越传统游戏边界的极致娱乐吧!《AS...
阅读更多
美的双开门冰箱,节能一级能效,手价5315.6
初识算法 · 滑动窗(1)...
阅读更多