LeetCode 热题 HOT 100:滑动窗口专题

news/2024/5/20 7:57:26 标签: leetcode, 算法, java, 滑动窗口

LeetCode 热题 HOT 100:https://leetcode.cn/problem-list/2cktkvj/


文章目录

    • 3. 无重复字符的最长子串
    • 128. 最长连续序列
    • 239. 滑动窗口最大值
    • 438. 找到字符串中所有字母异位词


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

题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

java">class Solution {
    public int lengthOfLongestSubstring(String s) {
        // key 值为字符,value 值为字符位置 +1,加 1 表示从字符位置的后一个才开始不重复
        Map<Character, Integer> map = new HashMap<>();
        int start = 0; // 滑动窗口的左指针
        int maxLen = 0; // 最大长度
        for(int end = 0; end < s.length(); end ++){
            char ch = s.charAt(end);
            if(map.containsKey(ch)){ // 如果当前元素与窗口中的元素重复,那么更新start。
                // 若遇到 abba 这种字符串,当遍历到第二个 b 时,start 指向第二个 b。
                // 继续遍历到 a 是,map 中 a 的 value 指向第一个 b, 因此需要比较大小
                start = Math.max(start, map.get(ch));
            }
            map.put(ch, end + 1); // 无论是否更新 start,都会更新其 map 数据结构和结果 maxLen
            maxLen = Math.max(maxLen, end - start + 1);
        }
        return maxLen;
    }
}

128. 最长连续序列

题目链接:https://leetcode.cn/problems/longest-consecutive-sequence/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

java">class Solution {
    public int longestConsecutive(int[] nums) {
        if(nums.length==0){
            return 0;
        }
        Set<Integer> set = new TreeSet<>();
        for (int i = 0; i < nums.length; i++) { // 先去重再排序
            set.add(nums[i]);
        }
        int co = 0;
        for (Integer num : set) {
            nums[co++] = num;
        }
        return sliderWindows(nums, set.size());
    }

    public int sliderWindows(int[] nums, int len){
        int start = 0;
        int max = 1;
        for (int end = 1; end < len; end ++) {
            if(nums[end] - nums[end-1] != 1){
                start = end; 
            }
            max = Math.max(max, end - start + 1);
        }
        return max;
    }
}

239. 滑动窗口最大值

题目链接:https://leetcode.cn/problems/sliding-window-maximum/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

通过优先队列模拟堆结构:

java">class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int len = nums.length;
        int[] arr = new int[len-k+1];
        // 优先队列采用大顶堆的结构:存储当前元素和下标索引
        PriorityQueue<int[]> heaps = new PriorityQueue<>((arr1, arr2) -> arr2[0]-arr1[0]);
        
        for(int i = 0; i < k; i ++){
            heaps.add(new int[]{nums[i], i}); // 尾部添加元素
        }
        
        int co = 0;
        arr[co++] = heaps.peek()[0];
        for(int i = k; i < len; i ++){
            heaps.add(new int[]{nums[i], i});
            while(heaps.peek()[1] <= i-k){ 
                // 当数组是 3,1,-1,4 时,滑动窗口大小为 3,当遍历到 4 时堆顶元素 4 已经失效
                // 更大的元素进队时,栈顶元素不用出队了,避免了频繁的出队
                // 当 4 也失效出堆,假设 3 是堆中的最大值,当 4 出堆时调整堆,3 变成堆顶,最终也会根据索引超出范围将 3 出堆。
                heaps.poll(); // 从堆顶出堆,并调整堆
            }
            arr[co++] = heaps.peek()[0];
        }
        return arr;
    }
}

438. 找到字符串中所有字母异位词

题目链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

分别设置比较串和待比较串的窗口,窗口为 26 个字母的出现的次数,遍历比较即可得出结果:

java">class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> res = new ArrayList<>();
        if(s.length() < p.length()){ // 如果 p 的长度大于待比较的 s 长度,则不存在异位词
            return res;
        }
        int sLen = s.length();
        int pLen = p.length();
        int[] sWin = new int[26];
        int[] pWin = new int[26];

        for(int i = 0; i < pLen; i ++){
            sWin[s.charAt(i) - 'a']++;
            pWin[p.charAt(i) - 'a']++;
        }

        if(Arrays.equals(sWin, pWin)){
            res.add(0);
        }

        for(int i = pLen; i < sLen; i ++){
            sWin[s.charAt(i-pLen) - 'a'] --;
            sWin[s.charAt(i) - 'a'] ++;
            if(Arrays.equals(sWin, pWin)){
                res.add(i-pLen+1);
            }
        }
        return res;
    }
}

http://www.niftyadmin.cn/n/4999106.html

相关文章

k8s deployment服务回滚,设置节点为不可调度

服务回滚 通过滚动升级的策略可以平滑的升级Deployment&#xff0c;若升级出现问题&#xff0c;需要最快且最好的方式回退到上一次能够提供正常工作的版本。为此K8S提供了回滚机制。 revision&#xff1a;更新应用时&#xff0c;K8S都会记录当前的版本号&#xff0c;即为revi…

【LeetCode每日一题合集】2023.8.14-2023.8.20(⭐切披萨3n块披萨)

文章目录 617. 合并二叉树833. 字符串中的查找与替换&#xff08;模拟&#xff09;2682. 找出转圈游戏输家&#xff08;模拟&#xff09;1444. 切披萨的方案数&#xff08;⭐⭐⭐⭐⭐&#xff09;解法——从递归到递推到优化&#xff08;二维前缀和记忆化搜索&#xff09; 1388…

NPM 常用命令(二)

目录 1、npm bugs 1.1 配置 browser registry 2、npm cache 2.1 概要 2.2 详情 2.3 关于缓存设计的说明 2.4 配置 cache 3、 npm ci 3.1 描述 3.2 配置 install-strategy legacy-bundling global-style omit strict-peer-deps foreground-scripts ignore-s…

有趣,复试竟不算专业课!信号学的不好,就选它!

一、学校及专业介绍 广西民族大学&#xff08;简称广西民大&#xff0c;GuangXi University for Nationalities&#xff09;&#xff0c;坐落于广西壮族自治区南宁市&#xff0c;是国家民族事务委员会和广西壮族自治区人民政府共建高校。 创建于1952年&#xff0c;原为中央民…

【postgresql 基础入门】数据库服务的管理

数据库服务管理 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff…

Android——线程和线程池

线程和线程池 AsyncTaskIntentService线程池ThreadPoolExecutorFixedThreadPoolCachedThreadPoolScheduledExecutorSingleThreadExecutor AsyncTask 使用案例可看Android基础——异步消息处理&#xff0c;需要注意 AsyncTask必须在主线程中加载&#xff0c;在ActivityThread的…

RK3568-android11-适配ov13850摄像头

硬件连接 主要分为两部分: mipi接口:传输摄像头数据 i2c接口:配置摄像头和对焦马达芯片寄存器相关驱动 |-- arch/arm64/boot/dts/rockchip DTS配置文件 |-- drivers/phy/rockchip/|-- phy-rockchip-mipi-rx.c mipi dphy 驱动 |-- drivers/media||-- platform/rockchip/isp1…

学习Bootstrap 5的第三天

文字/排版 默认设置 font-size&#xff1a;Bootstrap 5 的默认字体大小为 16px&#xff0c;也可以通过自定义 CSS 样式来修改。line-height&#xff1a;默认行高为 1.5&#xff0c;这意味着每行文本的高度是字体大小的 1.5 倍。也可以通过自定义 CSS 样式来修改行高。字体设置…