芝士算法 滑动窗口(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;
        
    }
相关推荐
Darling噜啦啦6 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠7 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾7 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres8217 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q7 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒7 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记7 天前
单项不带头不循环链表
数据结构·链表
小糯米6017 天前
JS 数组
数据结构·算法·排序算法
小欣加油7 天前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展
凌波粒7 天前
LeetCode--90.子集II(回溯算法)
数据结构·算法·leetcode