当前位置:首页 > 编程笔记 > 正文
已解决

同向双指针 滑动窗口【基础算法精讲 03】

来自网友在路上 155855提问 提问时间:2023-10-02 03:38:03阅读次数: 55

最佳答案 问答题库558位专家为你答疑解惑

长度最小的子数组 : 

链接 : 

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路 : 

滑动窗口的思想,取i=j=0,向后遍历j,记录前缀和[l,r]为s,如果s>=target,那么左端点向右移动,直到s<target,维护一个[l,r]的滑动窗口,如此循环;

代码 : 

Python :

class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:n = len(nums)ans = n+1l=0s=0for r,x in enumerate(nums):s+=xwhile s>=target:ans = min(ans,r-l+1)s-=nums[l]l+=1return ans if ans <= n else 0

C++

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();int i=0,j=0;long long sum = 0;int ans = INT_MAX;while(j<n){sum += nums[j];while(sum >= target){ans = min(ans,j-i+1);sum -= nums[i++];}j++;}return ans == INT_MAX ? 0 : ans;}
};

乘积小于K的子数组

链接 : 

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思想 : 

滑动窗口,和上一题的思想一模一样;

对于一个区间[l,r],r固定,如果[l,r]的乘积小于k,那么对于整个区域满足乘积小于k的数量就是r-l+1个;

代码 : 

class Solution:def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:if k<=1:return 0n = len(nums)ans = 0l = 0pf = 1for r,x in enumerate(nums):pf *= xwhile pf >= k:pf /= nums[l]l += 1ans += r - l + 1return ans

无重复元素的子串

链接 : 

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路 : 

双指针,哈希表

思路和前两题类似;

假设在一个无重复元素的字符串后面加上一个字符,如果出现重复元素,那么一定重复的是新加上的那个字符,那么设置一个hash表来统计次数,然后反复将窗口最前面的元素移出窗口,直到将前面与新加元素相同的元素移出时停止;然后循环更新答案即可;

代码 : 

Python

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:l = 0cnt = Counter()ans = 0for r , c in enumerate(s):cnt[c]+=1while cnt[c]>=2:cnt[s[l]]-=1l+=1ans = max(ans,r-l+1)return ans

C++

class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char,int> hash;int ans=0;int n = s.size();int l=0;for(int r=0;r<n;r++){hash[s[r]]++;while(hash[s[r]] > 1) --hash[s[l++]];ans = max(ans,r-l+1);}return ans;}
};

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"同向双指针 滑动窗口【基础算法精讲 03】":http://eshow365.cn/6-15672-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!