芝士算法 滑动窗口(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;
        
    }
相关推荐
想做小南娘,发现自己是女生喵10 小时前
【无标题】
数据结构·算法
凤凰院凶涛QAQ14 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
郝学胜-神的一滴15 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
Irissgwe15 小时前
算法滑动窗口
数据结构·算法
LuminousCPP18 小时前
C 语言集中实践全记录:顺序表 + 单链表原理实现与通讯录项目实战【附可运行源码】
c语言·开发语言·数据结构·经验分享·笔记
兰令水18 小时前
hot100【acm版】【2026.7.13打卡-java版本】
java·开发语言·数据结构·算法·leetcode·面试
LuminousCPP21 小时前
单链表专题(应用篇):三道经典题吃透删除、反转与快慢指针
c语言·数据结构·笔记
:-)1 天前
算法-希尔排序
数据结构·算法·排序算法
罗超驿1 天前
2.算法效率的核心密码:时间复杂度和空间复杂度详解
java·数据结构·算法
:-)2 天前
算法-堆排序
数据结构·算法·排序算法