芝士算法 滑动窗口(1.0)

目录

长度最小的子数组

无重复字符的最长子串

最大连续1个数

[将 x 减到 0 的最小操作数](#将 x 减到 0 的最小操作数)


滑动窗口 : 通常通过两个指针(左指针和右指针,同向指针)来定义窗口的边界。右指针用于扩展窗口,左指针用于收缩窗口,通过调整指针位置来找到满足条件的解。

还是从题目出发更容易理解

长度最小的子数组

java 复制代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {

    int sum = 0;
    int n = nums.length;
    int len = Integer.MAX_VALUE;
    for(int left = 0,right = 0; right < n ; right++){
        sum +=  nums[right] ;//进窗口
        while(sum >= target)//判断
        {
            
           len = Math.min(len, right - left + 1);
           sum -= nums[left++];//出窗口 + 结果更新
        }
    }
    return len == Integer.MAX_VALUE ? 0 : len;
}
}

无重复字符的最长子串

有了上一个题的基础 本题稍稍做了难度的提升

java 复制代码
public int lengthOfLongestSubstring(String s) {
        char[] s1 = s.toCharArray();
        int [] hash = new int[128];
        int n = s.length();
        int left =0; 
        int right =0;
        int ret = 0;
        while(right < n){
            hash[s1[right]]++;
            while(hash[s1[right]] > 1){
                hash[s1[left++]]--;
            }
            ret = Math.max(ret , right - left + 1);
            right++;
        } 
        return ret;
    }

最大连续1个数

java 复制代码
   public int longestOnes(int[] nums, int k) {
   
        int n  =nums.length;
        int ret = 0;
        for(int right = 0,left = 0,zero = 0; right < n ; right++){
            if(nums[right] == 0)//进窗口
            {
                zero++;
            }
            while(zero > k)//判断
            {
               if(nums[left++] == 0)//出窗口
               {
                zero--;
            }
            }
             ret = Math.max(ret,right - left + 1);
        }
        return ret;
    }

将 x 减到 0 的最小操作数

java 复制代码
public int minOperations(int[] nums, int x) {
        int n = nums.length;
        int sum = 0;
        for(int a : nums){
            sum += a;
        }
        int target = sum  - x;
        //细节处理
        if(target < 0)
        return -1;
         
        int len = -1;
        
        for(int right = 0, left = 0,tmp = 0; right < n ; right++){
            tmp += nums[right];
           
            while(tmp >  target){
                tmp -= nums[left++];
            }
            if(tmp == target){
                len = Math.max(len,right - left + 1);
            }
        }
        if(len == -1)
        return len;
       
        return n - len;
        
    }
相关推荐
进击的荆棘1 小时前
优选算法——队列+宽搜
数据结构·c++·算法·leetcode·bfs·队列
进击的荆棘2 小时前
优选算法——栈
数据结构·c++·算法·leetcode·
嘿黑嘿呦3 小时前
数据结构-图论-最短路径
数据结构·图论
也曾看到过繁星13 小时前
数据结构---顺序表
数据结构
meilindehuzi_a14 小时前
深入浅出数据结构:Python 字典(Dict)与集合(Set)的哈希表底层全链路追踪
数据结构·python·散列表
_日拱一卒14 小时前
LeetCode:207课程表
java·数据结构·算法·leetcode·职场和发展
z2005093018 小时前
今日算法(回溯子集)(模版题)
数据结构·算法·leetcode
QiLinkOS18 小时前
【用呼吸重构创造价值关系——QiLink生态】
c语言·数据结构·c++·人工智能·单片机·嵌入式硬件·算法
晚风予卿云月19 小时前
【前缀和】一维前缀和 & 二维前缀和
数据结构·c++·算法