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

长度最小的子数组 :

链接 :

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

思路 :

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

代码 :

Python :

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

C++

cpp 复制代码
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个;

代码 :

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

无重复元素的子串

链接 :

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

思路 :

双指针,哈希表

思路和前两题类似;

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

代码 :

Python

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

C++

cpp 复制代码
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;
    }
};
相关推荐
芬加达10 分钟前
leetcode34
java·数据结构·算法
资深web全栈开发27 分钟前
LeetCode 1015. 可被 K 整除的最小整数 - 数学推导与鸽巢原理
算法·leetcode·职场和发展
leoufung44 分钟前
链表题目讲解 —— 删除链表的倒数第 n 个节点(LeetCode 19)
数据结构·leetcode·链表
dragoooon341 小时前
[优选算法专题八.分治-归并 ——NO.46~48 归并排序 、数组中的逆序对、计算右侧小于当前元素的个数]
数据结构·算法·排序算法·分治
CoderYanger1 小时前
优选算法-队列+宽搜(BFS):72.二叉树的最大宽度
java·开发语言·算法·leetcode·职场和发展·宽度优先·1024程序员节
招摇的一半月亮1 小时前
P2242 公路维修问题
数据结构·c++·算法
星轨初途1 小时前
数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析
c语言·开发语言·数据结构·经验分享·笔记·算法·排序算法
人类发明了工具1 小时前
【机器人-激光雷达】点云时间运动补偿
算法·机器人
north_eagle2 小时前
向量搜索技术深度研究报告:架构原理、核心算法与企业级应用范式
算法·架构