想要精通算法和SQL的成长之路 - 无重复字符的最长子串和滑动窗口最大值

news2024/11/16 3:31:32

想要精通算法和SQL的成长之路 - 无重复字符的最长子串

  • 前言
  • 一. 无重复字符的最长子串
  • 二. 滑动窗口最大值
    • 2.1 滑动窗口的基本操作

前言

想要精通算法和SQL的成长之路 - 系列导航

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

原题链接
在这里插入图片描述
思路如下:

  • 用一个滑动窗口,该窗口区间范围内[left,right]的字符串我们认定为不包含重复字符。
  • 我们用一个HashMap存储每个字符最后一次出现的索引位置,left
  • 我们遍历字符串,下标是right。如果当前遍历的字符存在于我们这个HashMap中,说明遇到重复字符了。就需要计算当前窗口的无重复字符长度。
  • 开始计算当下窗口的长度,更新最大值。同时更新索引。
public int lengthOfLongestSubstring(String s) {
    HashMap<Character, Integer> dic = new HashMap<>();
    int length = s.length(), left = -1, max = 0;
    for (int right = 0; right < length; right++) {
        // 遇到重复字符了,更新最后一次出现的下标位置
        if (dic.containsKey(s.charAt(right))) {
            left = Math.max(left, dic.get(s.charAt(right)));
        }
        // 更新当前字符出现的最后一次位置
        dic.put(s.charAt(right), right);
        // 更新最大长度
        max = Math.max(max, right - left);
    }
    return max;
}

二. 滑动窗口最大值

原题链接
在这里插入图片描述

2.1 滑动窗口的基本操作

首先说下滑动窗口的一个重要特性:

  • 左右侧边界都可以改变,达到一个滑动的效果。

那么在Java里面,我们可以利用双向队列的特性来代表滑动窗口。

LinkedList<Integer> queue = new LinkedList<>();

这么一个数据结构,它用文字表达就是:

  • 队首 <----> 队尾

相关的操作就是:

  • 获取队首元素或者移除:addFirst | pollFirst
  • 获取队尾元素或者移除:addLast | pollLast

再回归我们本题,我们在滑动窗口里面存储什么东西比较合适?我们可以存储数组的下标,它有这么几个作用或者特性:

  • 我们可以根据下标拿到对应的值。而且下标容易用来计算滑动窗口的大小和位置。
  • 我们让滑动窗口存储的下标,让其对应的值,按照从大到小的顺序来排序。这样队首下标对应的元素就是我们需要的滑动窗口的最大值。

我们来看代码,几个重要的点就是:

  1. 遇到比较大的元素(比队尾的大),就要以此从队尾移除元素。保证下标值对应的数组元素从大到小
  2. 如果滑动窗口的大小超过了k,就要把队首元素移除。
  3. 只要满足了滑动窗口的大小,就可以把对应的最大值添加到结果集中。
public int[] maxSlidingWindow(int[] nums, int k) {
    // 特判
    if (nums == null || nums.length < 2) {
        return nums;
    }
    // 双向队列,存储的是数组的下标,数组下标对应的值从大到小存储
    LinkedList<Integer> queue = new LinkedList<>();
    int[] res = new int[nums.length - k + 1];
    for (int i = 0; i < nums.length; i++) {
        // 1.把比当前元素值小的以此从队尾排出。队首(从大)--->队尾(到小)
        while (!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]) {
            queue.pollLast();
        }
        // 将当前下标加入到队尾
        queue.addLast(i);
        // 2.若滑动窗口大小超了,把队首元素剔除
        if (queue.peek() <= i - k) {
            queue.poll();
        }
        // 3.如果满足了滑动窗口长度,取队首元素对应的值即可
        if (i + 1 >= k) {
            res[i + 1 - k] = nums[queue.peek()];
        }
    }
    return res;
}

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

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

相关文章

WSL 0x80071772 错误解决方案

WSL 0x80071772 错误解决方案 副标题 WSL 安装到 C 盘以外解决方案 当电脑的存储位置设置为 C 盘以为的位置时安装 WSL 会有如下报错; 原因上面也说过了,保0x80071772的错误主要是因为 WSL 安装到了 C 盘以外的位置,知道了原因也就有了如下的解决方案,该解决方案有两种 解决…

iMazing 2023年最新苹果手机怎么备份恢复照片

目前图像技术发展飞快&#xff0c;HDR和4K照片已经见怪不怪&#xff0c;这些高清照片轻而易举就可以达到10MB以上&#xff0c;所以大家经常会出现手机空间不足的情况&#xff0c;此时就需要把照片移动到电脑上备份。至于照片备份怎么弄&#xff0c;照片备份的软件有哪些&#x…

【Java】抽象类和接口的区别

1. 成员区别 抽象类 变量 常量&#xff1b;有构造方法&#xff0c;有抽象方法&#xff0c;也有非抽象方法接口 常量&#xff0c;抽象方法&#xff08;JDK8 在接口中定义 非抽象方法&#xff09; 2. 关系区别 类与类 继承单继承类与接口 实现&#xff0c;单实现和多实现接口…

【Java】HashMap 背诵版

HashMap 背诵版 1. HashMap、Hashtable 和 ConcurrentHashMap 的区别&#xff1f;1.1 线程安全&#xff1a;1.2 继承关系&#xff1a;1.3 允不允许null值&#xff1a; 2. HashMap 的数据结构2.1 什么是hash表&#xff1f;2.2 HashMap 的数据结构 3. 什么是hash冲突&#xff0c;…

输入文本波形动画

效果展示 CSS 知识点 绝对定位 实现页面基础布局 <div class"input_box"><input type"text" required /><!-- 动画实际执行者 --><label>Wavy Input Text Aimation</label> </div>使用 JS 把 label 标签的文字拆分…

UG\NX二次开发 特征选择对话框 UF_UI_select_feature

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 qq_42007619 订阅本专栏,非常感谢。 简介: UG\NX二次开发 特征选择对话框 UF_UI_select_feature 效果: 代码: #include <vector>…

[硬件基础]-快速了解触发器

快速了解触发器 文章目录 快速了解触发器1、触发器概述2、触发器和锁存电路之间的区别3、触发器的类型3.1 SR触发器3.2 D触发器3.3 JK触发器3.4 SR触发器和JK触发器的区别3.5 T触发器 触发器是制造存储器件和数字逻辑电路的最重要主题之一。 在本文中&#xff0c;我将讨论触发器…

在LangChain中使用Milvus + openai使用

Milvus(opens in a new tab) 是一个存储、索引和管理由深度神经网络和其他机器学习&#xff08;ML)模型生成的大规模嵌入向量的数据库。 1.文档分割 from langchain.document_loaders import PyPDFLoader pdfloader PyPDFLoader("D:\py\LangChaindao\操作系统原理.pdf&…

安全性算法

目录 一、安全性算法 二、基础术语 三、对称加密与非对称加密 四、数字签名 五、 哈希算法 六、哈希算法碰撞与溢出处理 一、安全性算法 安全性算法的必要性&#xff1a; 安全性算法的必要性是因为在现代数字化社会中&#xff0c;我们经常需要传输、存储和处理敏感的数据…

Linuxzhi6通过源代码编译安装软件

目录 一、使用源代码安装软件的优点 二、编译需求 三、安装 一、使用源代码安装软件的优点 由于自由软件的最新版本大都以源码的形式最先发布&#xff0c;编译安装可以获得软件的最新版本&#xff0c;及时修 复bug 如果当前安装的程序无法满足需求&#xff0c;用户可以根据…

合宙Air780e+luatos+腾讯云物联网平台完成设备通信与控制(属性上报+4G远程点灯)

1.腾讯云物联网平台 首先需要在腾讯云物联网平台创建产品、创建设备、定义设备属性和行为&#xff0c;例如&#xff1a; &#xff08;1&#xff09;创建产品 &#xff08;2&#xff09;定义设备属性和行为 &#xff08;3&#xff09;创建设备 &#xff08;4&#xff09;准备参…

Python小技巧:快速合并字典dict()

文章目录 前言知识点字典合并1. dict.update()基础合并2. 字典推导式 update() 后话 前言 这里是Python小技巧的系列文章。这是第四篇&#xff0c;快速合并字典。 在Python的使用中&#xff0c;有时候需要将两个 dict(字典) 进行合并。 通常我们会借助 dict(字典) 的内置方法 …

【C语言】编译和链接

前言&#xff1a; 编译和链接是计算机程序开发中的两个重要步骤&#xff0c;用于将源代码转化为可执行的程序。 文章目录 一、翻译环境和运行环境二、翻译环境中的编译2.1 预处理&#xff08;预编译&#xff09;2.2 编译2.2.1 语法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编 三…

【Audio】正弦波生成原理及C++代码

正弦波生成及频谱分析 正弦波公式 诊断系统&#xff08;Diag&#xff09;会通过播放一段指定频率、采样率、时长及振幅的正弦音&#xff0c;以此对Audio测试。正弦波的公式如下&#xff0c;其中 A是振幅、x是时间、F是频率。 y A ∗ sin ⁡ ( 2 ∗ π ∗ x ∗ F ) y A* \s…

【考研数学】高等数学第七模块 —— 曲线积分与曲面积分 | 4. 对坐标的曲面积分(第二类曲面积分)与场论初步

文章目录 二、曲面积分2.2 对坐标的曲面积分&#xff08;第二类曲面积分&#xff09;1. 问题产生 —— 流量2. 对坐标的曲面积分的定义&#xff08;了解&#xff09;3. 对坐标的曲面积分的性质4. 对坐标的曲面积分的计算法&#xff08;1&#xff09; 二重积分法&#xff08;2&a…

properties文件和yaml文件的区别~

之前&#xff0c;关于数据库的连接信息&#xff0c;端口号的设置等&#xff0c;我们会将它分门别类的写在多个文件中&#xff0c;但SpringBoot&#xff0c;它讲究统一的配置管理&#xff0c;我们想设置的任何参数都集中在一个固定位置和命名的配置文件&#xff0c;而该配置文件…

10.4| QT实现TCP服务器客户端搭建的代码,现象

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>#include<QTcpServer> //服务器头文件 #include<QTcpSocket> //客户端头文件#include<QList> //链表容器 #include<QMessageBox> …

Error string: Could not load library

启动Rivz时&#xff0c;报错&#xff1a; Error string: Could not load library (Poco exception libg2o_csparse_extension.so.0.1: cannot open shared object file: No such file or directory) [ERROR] [1696572310.529059051]: Failed to load nodelet [/radar_graph_s…

破译滑块验证间距 破译sf顺丰滑块验证

废话不多说直接开干&#xff01; from selenium import webdriver # 导入配置 from selenium.webdriver.chrome.options import Options import time from PIL import Image # 导入动作链 from selenium.webdriver.common.action_chains import ActionChains import random, st…

如何获取高质量的微信私域客户?

在当今数字化时代&#xff0c;企业都在努力寻求创新的营销方式来获取更多的客户。微信私域流量作为一种精准的营销工具&#xff0c;越来越受到企业的青睐。那么&#xff0c;如何获取高质量的微信私域客户呢&#xff1f;本文将为你揭示这一难题的答案&#xff0c;让你轻松Get高转…