芝士算法 滑动窗口(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;
        
    }
相关推荐
小星星闪亮登场39 分钟前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶1 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
2501_942389552 小时前
Epoch AI旗下FrontierMath的负责人Elliot Glazer
数据结构·决策树·动态规划·散列表
shylyly_3 小时前
104.二叉树的最大深度
数据结构·算法·104.二叉树的最大深度
白白白小纯7 小时前
每日算法day3—回文链表,链表分割
c语言·数据结构·算法·leetcode
zander2589 小时前
35. 搜索插入位置:从边界语义理解二分查找
数据结构·算法·leetcode
Chen—LSN9 小时前
C语言——深度理解指针(5)
c语言·数据结构·算法·排序算法
佳児素花痴╮11 小时前
树的基础知识与查找排序算法
数据结构·算法
郝学胜-神的一滴12 小时前
Python 高级编程 026:内置数据结构之骈文纵论
开发语言·数据结构·python·程序人生·软件工程
程序员老舅18 小时前
啃透 I2C 驱动开发,才算入门嵌入式 Linux 内核驱动
数据结构·驱动开发·b树·内核·嵌入式·嵌入式开发·i2c