【算法系列】滑动窗口

news2024/11/25 14:55:50

计算长度为k的连续子数组的最大总和

给定一个整数数组,计算长度为k的连续子数组的最大总和。

输入:arr [] = {100,200,300,400} k = 2

输出:700

解释:300 + 400 = 700

解决思路

  1. 暴力解法:从k到n-k+1,计算k长度大小的窗口。
  2. 计算(0,k-1)窗口的数据和,减去第一个,加上最后一个。求最大值。

Java实现

public class SlidingWindow {

    public void maxSumSliding() {
        //定义长度
        int k = 2;
        //定义数组
        int[] arr = {100, 200, 300, 400};
        int size = arr.length;
        if (size < k) {
            return;
        }
        int maxSum = 0;
        for (int i = 0; i < k; i++) {
            maxSum += arr[i];
        }
        for (int i = k; i < size; i++) {
            maxSum = Math.max(maxSum + arr[i] - arr[i - k], maxSum);
        }
        System.out.println(maxSum);
    }
}

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

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

解决思路

  1. 发现前面子串中有该元素,需要移除旧的元素。不是第一个,不是全部移除,而是用while判断set.contains(s.charAt(i))

Java实现

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int len = s.length();
        HashSet<Character> set = new HashSet<>();
        int res = 0;
        int start = 0;
        for (int i = 0; i < len; i++) {
            while (set.contains(s.charAt(i))) {
                set.remove(s.charAt(start));
                start++;
            }
            set.add(s.charAt(i));
            res = Math.max(res, i - start + 1);
        }
        return res;
    }
}

53. 最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

解决思路

  1. 求子串的和,判断是否小于0,小于0,则不累加。

Java实现

class Solution_LC53_II {
    public int maxSubArray(int[] nums) {
        int res = Integer.MIN_VALUE;
        int curSum = 0;
        for (int i = 0; i < nums.length; i++) {
            curSum += nums[i];
            res = Math.max(curSum, res);
            if (curSum < 0) {
                curSum = 0;
            }
        }
        return res;
    }
}

76. 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。

解决思路

  1. 计算字符串t中每个字符出现的次数
  2. 挨个添加字符串s中的字符,如果该字符数出现在s中的次数小于t,有效次数+1;
  3. 尝试删除最前面的元素,当满足t中不存在或者t中出现的次数小于s,最前面的字符是多余的。
  4. 当有效字符的长度等于t的长度,且截取的字符串长度小于最小值,更新。

Java实现

class Solution {
    public String minWindow(String s, String t) {
        HashMap<Character, Integer> st = new HashMap<>();
        for (int i = 0; i < t.length(); i++) {
            Integer count = st.getOrDefault(t.charAt(i), 0);
            st.put(t.charAt(i), count + 1);
        }
        String ans = "";
        int len = Integer.MAX_VALUE;
        int j = 0;
        int count = 0;//有效字符
        HashMap<Character, Integer> sh = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            sh.put(s.charAt(i), sh.getOrDefault(s.charAt(i), 0) + 1);
            if (st.containsKey(s.charAt(i)) && sh.get(s.charAt(i)) <= st.get(s.charAt(i))) {
                count++;
            }
            while (j < i && (!st.containsKey(s.charAt(j)) || sh.get(s.charAt(j)) > st.get(s.charAt(j)))) {
                Integer cnt = sh.get(s.charAt(j));
                sh.put(s.charAt(j), cnt - 1);
                j++;
            }
            if (i - j + 1 < len && count == t.length()) {
                len = i - j + 1;
                ans = s.substring(j, i + 1);
            }
        }
        return ans;

    }
}

239. 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

解决思路

  1. 优先队列,倒序。最大的在最上面。判断最大的元素的索引是否超过窗口,[i-k+1,i]
  2. 滑动窗口,判断队列首是否超过窗口,挨个将次大的元素排列在队列后面。

Java实现

优先队列

class Solution_LC239_II {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums == null || nums.length == 0) {
            return new int[0];
        }
        int n = nums.length;
        PriorityQueue<int[]> priorityQueue = new PriorityQueue<>((a, b) -> {
            return b[1] > a[1] ? 1 : -1;
        });
        int[] res = new int[n - k + 1];
        for (int i = 0; i < nums.length; i++) {
            priorityQueue.offer(new int[]{i, nums[i]});
            if (i >= k - 1) {
                while (priorityQueue.peek()[0] <= i - k) {
                    priorityQueue.poll();
                }
                res[i - k + 1] = priorityQueue.peek()[0];
            }
        }
        return res;
    }
}

滑动窗口

class Solution_LC239_II {

    public int[] maxSlidingWindow(int[] nums, int k) {
        Deque<Integer> deque = new LinkedList<>();
        int len = nums.length;
        int[] res = new int[len - k + 1];
        for (int i = 0; i < len; i++) {
            while (!deque.isEmpty() && deque.peek() <= i - k) {
                deque.poll();
            }
            while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
                deque.pollLast();
            }
            deque.offer(i);
            if (i - k + 1 >= 0) {
                res[i - k + 1] = nums[deque.peek()];
            }
        }
        return res;
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短视频seo矩阵系统+抖音小程序源码开源部署(二)

一、短视频矩阵源码系统开发要则&#xff1a; 1. 需求分析&#xff1a;对短视频平台的需求进行全面分析&#xff0c;确立系统开发目标和方向。 2. 技术选型&#xff1a;选用最适合的技术开发短视频矩阵系统&#xff0c;如前端框架、数据库、服务器等。 3. 系统设计&#xff…

Parseval’s theorem

一、Parseval’s theorem介绍 帕塞瓦尔定理Parseval’s theorem表明了信号的能量在时域和频域相等。 ∫ − ∞ ∞ ∣ f ( t ) ∣ 2 d t 1 2 π ∫ − ∞ ∞ ∣ F ( ω ) ∣ 2 d ω ∫ − ∞ ∞ ∣ F ^ ( f ) ∣ 2 d f \int_{-\infty}^{\infty}|f(t)|^{2} \mathrm{~d} t\frac…

Android Studio实现内容丰富的安卓美食管理发布平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号079 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告 3.查…

web安全php基础_php数据类型

PHP 数据类型 PHP 支持以下几种数据类型: String&#xff08;字符串&#xff09;Integer&#xff08;整型&#xff09;Float&#xff08;浮点型&#xff09;Boolean&#xff08;布尔型&#xff09;Array&#xff08;数组&#xff09;Object&#xff08;对象&#xff09;NULL&…

2023 亚马逊云科技中国峰会:全面加码 AIGC、深耕中国下一个十年

编辑 | 宋慧 出品 | CSDN 云计算 亚马逊云科技每年在中国的顶级会议——2023亚马逊云科技中国峰会如期而至。今年中国峰会回归线下举办&#xff0c;主会场和分论坛几乎全部爆满&#xff0c;技术展区人头攒动&#xff0c;现场技术赛事与开发者大讲堂活动丰富精彩&#xff0c;可…

基于SSM的高校专业信息管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【UE】通过滑条放大子画面

在文章&#xff08;【UE4 第一人称射击游戏】33-创建一个小地图&#xff09; 基础上实现通过滑条放大子画面 效果 步骤 在控件蓝图中拖入滑条组件 主要的思想就是当滑条的值变更时去改变摄像机相对位置

图片框架Glide学习总结及插件实现

一.前言 图片加载框架个人选择的是Glide&#xff0c;该框架非常优秀&#xff0c;其知识体系很庞大&#xff0c;个人就对Glide部分知识的学习做一下总结&#xff0c;同时对框架的使用做一下封装&#xff0c;做成插件。 二.知识主干 知识主干如下&#xff0c;每一部分的知识会…

Selenium基础 — Selenium自动化测试框架介绍

1、什么是selenium Selenium是一个用于Web应用程序测试的工具。只要在测试用例中把预期的用户行为与结果都描述出来&#xff0c;我们就得到了一个可以自动化运行的功能测试套件。Selenium测试套件直接运行在浏览器中&#xff0c;就像真正的用户在操作浏览器一样。Selenium也是…

TPU-MLIR实战——ResNet18部署

1.编译ONNX模型 本章以 resnet18.onnx 为例, 介绍如何编译迁移一个onnx模型至BM1684X TPU平台运行。 该模型来自onnx的官网: models/vision/classification/resnet/model/resnet18-v1-7.onnx at main onnx/models GitHub 本例模型和代码在 http://219.142.246.77:65000//…

MySQL密码授权

目录 更改密码策略 方法1:临时修改​编辑 方法2:初始化时不启用​编辑 方法3:修改配置文件 远程登录 法一&#xff1a; 1、配置root密码&#xff08;或 use mysql&#xff09; 2、更新为所有主机 3、刷新权限表 法二&#xff1a;添加权限 更改密码策略 方法1:临时修改…

github中Mermaid的用法

这个东西是最近推出&#xff0c;首先是自己的repository中新建一个readme.md文件 需要一点前端的知识&#xff0c;就是先导入一个依赖文件&#xff0c;然后再写甘特图&#xff0c;如下&#xff1a; ### 甘特图 [<a href"https://mermaid-js.github.io/mermaid/#/gant…

【macOS 系列】如何在mac 邮件客户端配置QQ邮箱和第二个账号

文章目录 一、配置QQ邮箱二、添加新的账户 一、配置QQ邮箱 需要在QQ邮箱账户设置中开启&#xff1a; 开启时&#xff0c;会让你发短信到指定号码&#xff0c;然后就会弹出一个验证码 也就是添加邮箱的密码不是QQ密码&#xff0c;而是这个验证码&#xff0c;这个可以生成多个&…

Stable Diffusion WebUI 汉化 Ubuntu 22.04平台

当前状态 下载汉化扩展到extension目录 cd /home/yeqiang/Downloads/ai/stable-diffusion-webui/extensions https://github.com/dtlnor/stable-diffusion-webui-localization-zh_CN.git 重启webui 在Extensions中&#xff0c;查看状态&#xff0c;已经列出来汉化扩展 点击Se…

企业内部安全:利用 ADAudit Plus 管理与加强安全审计

在现代数字化时代&#xff0c;企业面临着日益复杂和不断变化的安全威胁。为了保护敏感数据、遵守合规要求以及防范内部威胁&#xff0c;企业需要有效的安全审计解决方案。ADAudit Plus 是一款强大而全面的安全审计工具&#xff0c;可以帮助企业管理和加强内部安全。 ADAudit Pl…

【分布式应用】Zabbix监控6.0

目录 一、Zabbix简介1.1监控软件的作用1.2zabbix是什么1.3zabix监控原理1.4 Zabbix6.0新特性1.4.1 Zabbix server高可用防止硬件故障或计划维护期的停机&#xff1a;1.4.2 Zabbix 6.0 LTS新增Kubernetes监控功能&#xff0c;可以在Kubernetes系统从多个维度采集指标&#xff1a…

15---三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&…

k8s1.19使用ceph15 rbd块存储

一、ceph集群操作 #创建rbd #创建存储池,指定pg和pgp的数量, pgp是对存在于pg的数据进行组合存储,pgp通常等于pg的值 # 创建存储池 ceph osd pool create kubernetes 128 128#对存储池启用 RBD 功能 ceph osd pool application enable kubernetes rbd#通过 RBD 命令对存储池…

《MySQL》对库进行操作(DDL语句)

文章目录 &#x1f4a1;创建库&#x1f4a1;修改库&#x1f4a1;删除库&#x1f4a1;备份库 学习DDL前&#xff0c;先掌握一下几个常用的查看指令 # 查看库 show databases; # 选中库 use [库名] # 查看连接情况 show processlist;&#x1f4a1;创建库 # &#xff08;如果不存…

TLS/SSL 协议

TLS/SSL 协议的工作原理 TLS/SSL 协议的工作原理 • 身份验证 • 保密性 • 完整 TLS/SSL 发展 TLS 协议 • Record 记录协议 • 对称加密 • Handshake 握手协议 • 验证通讯双方的身份 • 交换加解密的安全套件 • 协商加密参 TLS 安全密码套件解 对称加密的工作原理&am…