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

想要精通算法和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.rhkb.cn/news/149416.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot自带模板引擎Thymeleaf使用详解①

目录 前言 一、SpringBoot静态资源相关目录 二、变量输出 2.1 在templates目录下创建视图index.html 2.2 创建对应的Controller 2.3 在视图展示model中的值 三、操作字符串和时间 3.1 操作字符串 3.2 操作时间 前言 Thymeleaf是一款用于渲染XML/HTML5内容的模板引擎&am…

数据分析视角中的商业分析学习笔记

数据分析一大堆&#xff0c;结果却是大家早就知道的结论&#xff1f;是工具和方法出问题了吗&#xff1f;真正原因可能是你的思维有误区。 为什么分析的这么辛苦&#xff0c;得出的结论大家早知道&#xff0c;谁谁都不满意&#xff1f;核心原因有3个&#xff1a; 分析之前&am…

DataX和dataX-web 集群部署及使用

&#x1f4d1; DataX和dataX-web 集群部署及使用 一 . 安装前准备 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 DataX 采用 框架 插件 的模式…

SpringBoot vue云办公系统

SpringBoot vue云办公系统 系统功能 云办公系统 登录 员工资料管理: 搜索员工 添加编辑删除员工 导入导出excel 薪资管理: 工资账套管理 添加编辑删除工资账套 员工账套设置 系统管理: 基础信息设置 部门管理 职位管理 职称管理 权限组管理 操作员管理 开发环境和技术 开发语…

网络准入 重定向,DNS劫持内网设备访问网站

环境&#xff1a;Nginx 问题&#xff1a; 1.某网络实施网络准入控制&#xff0c;需要劫持不受信网段的客户端 所有访问到指定引导页面 2.需要劫持PS4 用户访问任意网站&#xff0c;或用户指南 方式全自动破解 解决办法&#xff1a;搭建dnsmasq DNS服务器&#xff0c;全域名解析…

Spring MVC程序开发(JavaEE进阶系列3)

目录 前言&#xff1a; 1.什么是Spring MVC 1.1MVC的定义 1.2MVC和Spring MVC的关系 1.3为什么要学习Spring MVC 2.Spring MVC项目的创建 3.Spring MVC框架的使用 3.1连接的功能 3.1.1RequestMapping 3.1.2GetMapping 3.1.3PostMapping 3.2获取参数的功能 3.2.1获…

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…

Dubbo 融合 Nacos 成为注册中心

Nacos 作为 Dubbo 生态系统中重要的注册中心实现&#xff0c;本文将会介绍如何进行 Dubbo 对接 Nacos 注册中心的工作。 预备工作 请确保后台已经启动 Nacos 服务 快速上手 Dubbo 融合 Nacos 成为注册中心的操作步骤非常简单&#xff0c;大致步骤可分为“增加 Maven 依赖”…

【C++设计模式之原型模式:创建型】分析及示例

简介 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许通过复制已有对象来生成新的对象&#xff0c;而无需再次使用构造函数。 描述 原型模式通过复制现有对象来创建新的对象&#xff0c;而无需显式地调用构造函数或暴露对象的创建…

flink处理函数--副输出功能

背景 在flink中&#xff0c;如果你想要访问记录的处理时间或者事件时间&#xff0c;注册定时器&#xff0c;或者是将记录输出到多个输出流中&#xff0c;你都需要处理函数的帮助&#xff0c;本文就来通过一个例子来讲解下副输出 副输出 本文还是基于streaming-with-flink这本…

c#设计模式-行为型模式 之 责任链模式

&#x1f680;简介 又名职责链模式&#xff0c;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;将所有请求的处理者通过前一对 象记住其下一个对象的引用而连成一条链&#xff1b;当有请求发生时&#xff0c;可将请求沿着这条链传递&#xff0c;直到有对象处理它为…

sigmoid和softmax函数有什么区别

Sigmoid函数和Softmax函数都是常用的激活函数&#xff0c;但它们的主要区别在于应用场景和输出结果的性质。 Sigmoid函数&#xff08;也称为 Logistic函数&#xff09;&#xff1a; Sigmoid函数将输入值映射到0到1之间的连续实数范围&#xff0c;通常用于二元分类问题。 Si…

重置Jetson设备的Ubuntu密码:通过挂载根目录到另一个Linux系统

在本文中&#xff0c;我们将介绍如何在忘记Ubuntu 20.04密码的情况下重置密码。我们将通过将Ubuntu的根目录挂载到另一个Linux系统来实现这一目的。我们还将介绍chroot命令的功能。 1. 背景 最近&#xff0c;我们研发团队遇到了一个棘手的问题。一台用于研发&#xff0c;多人使…

小黑上午参加婚礼,下午去姥姥家帮着看店学习人情世故的leetcode之旅:213. 打家劫舍 II

动态规划 class Solution:def rob(self, nums: List[int]) -> int:# 数组长度n len(nums)if n 1:return nums[0]# 打家劫舍1中的函数def rob1(start, end):if start end:return nums[start]# 动态规划指针first 0second nums[start]third nums[start]# 动态规划操作f…

【C++】:类和对象(2)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

信息学奥赛一本通-编程启蒙3330:【例56.1】 和为给定数

3330&#xff1a;【例56.1】 和为给定数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 625 通过数: 245 【题目描述】 现给出若干个整数&#xff0c;询问其中是否有一对数的和等于给定的数。 【输入】 共三行&#xff1a; 第一行是整数nn(0<n≤100,000)&…

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

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

Python之元组

Python之元组 元组tuple 一个有序的元素组成的集合使用小括号 ( ) 表示元组是不可变对象 tuple(), (), type(()) # 空元组 ((), (), tuple)(1,), (1) # 元组中只有1必须加逗号&#xff0c;否则就是1了 # ((1,), 1)x 1, 2 # 以逗号分隔的内容会形成元组&#xff0c;封装元组x…

ubuntu配置vscode c++环境

下载vscode deb安装包 Get Started with C on Linux in Visual Studio Code 1. 安装vscode sudo dpkg -i code_1.83.0-1696350811_amd64.deb 2. 确保gcc编译器已经安装 g --version 如果没有安装&#xff0c;执行以下命令安装 sudo apt-get update sudo apt-get install …

博弈论——议价博弈(Bargaining)

议价博弈(Bargaining) 0 引言 议价(bargaining) 是市场经济中最常见的事情,也是博弈论最早研究的问题。这里介绍一种议价的动态博弈模型。同样地&#xff0c;对于动态博弈模型&#xff0c;我们还是用常见的逆推归纳法去寻找该博弈的子博弈完美纳什均衡。 1 议价博弈 议价博弈…