LeetCode之滑动窗口

209. 长度最小的子数组

java 复制代码
class Solution {
    // 方法 minSubArrayLen 接收一个整数 s 和一个整数数组 nums
    // 返回和大于或等于 s 的最小子数组长度
    public int minSubArrayLen(int s, int[] nums) {
        int n = nums.length; // 获取数组的长度
        // 如果数组为空,直接返回 0
        if (n == 0) {
            return 0;
        }
        
        // 初始化答案为最大整数,表示最小子数组的长度
        int ans = Integer.MAX_VALUE;
        // 初始化两个指针,分别为滑动窗口的左右边界
        int start = 0, end = 0;
        // 初始化当前窗口的总和
        int sum = 0;

        // 使用滑动窗口的方式,右边界 end 向右移动
        while (end < n) {
            sum += nums[end]; // 将当前元素加入总和
            // 当当前窗口的和大于或等于目标值 s 时,尝试收缩窗口
            while (sum >= s) {
                // 更新答案为当前窗口长度的最小值
                ans = Math.min(ans, end - start + 1);
                sum -= nums[start]; // 从总和中减去左边界的元素
                start++; // 移动左边界,缩小窗口
            }
            end++; // 移动右边界,扩展窗口
        }

        // 检查是否找到了符合条件的子数组,返回结果
        return ans == Integer.MAX_VALUE ? 0 : ans; // 如果 ans 没有更新,返回 0,不然返回 ans
    }
}

3. 无重复字符的最长子串

java 复制代码
class Solution {

    // 方法 lengthOfLongestSubstring 接收一个字符串 s,返回不包含重复字符的最长子串的长度
    public int lengthOfLongestSubstring(String s) {
        // 将字符串转换为字符数组
        char[] arr = s.toCharArray();
        
        // 创建一个集合以存储当前窗口中的字符
        Set<Character> set = new HashSet<>();

        // 初始化答案,表示最长子串的长度
        int ans = 0;

        // 使用双指针(滑动窗口)的方法
        for (int left = 0, right = 0; right < arr.length; right++) {
            // 当右指针指向的字符已经存在于集合中,收缩左边界
            while (set.contains(arr[right]))  {
                // 从集合中移除左指针指向的字符
                set.remove(arr[left]);
                // 左指针右移,继续寻找不重复的字符
                left++;
            }

            // 将当前右指针指向的字符加入集合
            set.add(arr[right]);
            // 更新答案,计算当前窗口的长度并取最大值
            ans = Math.max(ans, right - left + 1);
        }

        // 返回最长子串的长度
        return ans;
    }

}
相关推荐
Patrick在香港4 分钟前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术16 分钟前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫25 分钟前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话33 分钟前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
还是鼠鼠1 小时前
Spring AI连接DeepSeek与通义千问:application.yaml配置详解
java·通义千问·spring ai·deepseek
QAQo7T2 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
千里之行,始于足下sanhai2 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划
小星星闪亮登场2 小时前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces
计算机小白一个2 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
Loge编程生活2 小时前
打卡信奥刷题(3449)用C++实现信奥题 P10429 [蓝桥杯 2024 省 B] 拔河
开发语言·数据结构·c++·算法·青少年编程