当前位置: 首页 > news >正文

Java算法OJ(11)双指针练习


目录

1.前言

2.正文

2.1存在重复数字

2.1.1题目

 2.1.2解法一代码

解析:

2.1.3解法二代码

解析:

2.2存在重复数字plus 

2.2.1题目

2.2.2代码 

2.2.3解析 

3.小结


1.前言

哈喽大家好吖,今天来给大家分享双指针算法的相关练习,题目不多,但却是很经典的双指针的模型,废话不多说让我们开始吧。

2.正文

2.1存在重复数字

2.1.1题目

219. 存在重复元素 II - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/contains-duplicate-ii/?envType=problem-list-v2&envId=sliding-window

 2.1.2解法一代码

class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {// 创建一个 HashMap,用于存储每个元素的最后出现索引HashMap<Integer, Integer> map = new HashMap<>();// 遍历数组中的每个元素for (int i = 0; i < nums.length; i++) {// 检查当前元素是否已经出现在 map 中,并且索引差是否小于等于 kif (map.containsKey(nums[i]) && (i - map.get(nums[i]) <= k)) {return true;  // 如果条件满足,返回 true}// 将当前元素及其索引存入 map 中map.put(nums[i], i);}// 如果遍历完所有元素都没有找到满足条件的对,返回 falsereturn false;}
}
解析:

核心思路:

  • 哈希表存储元素的索引:

    • map 用来存储数组中每个元素的最新出现的索引。map.put(nums[i], i) 会在每次遍历时更新该元素的索引。
    • 通过 map.containsKey(nums[i]) 检查当前元素是否已经在哈希表中出现过,如果出现过,则进一步判断当前索引与该元素上次出现的索引之差是否小于等于 k
  • 判断条件:

    • 如果当前元素已经在哈希表中,并且当前索引 i 与该元素最后一次出现的索引之间的差值 i - map.get(nums[i]) 小于等于 k,则说明找到了符合条件的重复元素对,直接返回 true
    • 如果条件不满足,则将当前元素及其索引存入 map 中,继续遍历下一个元素。
  • 返回值:

    • 如果遍历完所有元素都没有找到满足条件的元素对,则返回 false。 

2.1.3解法二代码

class Solution {public boolean containsNearbyDuplicate(int[] nums, int k){// 使用 HashSet 存储当前窗口内的元素HashSet<Integer> set = new HashSet<>();// 遍历数组中的每个元素for(int i = 0; i < nums.length; i++){// 保证滑动窗口的大小不超过 kif(i > k) set.remove(nums[i - k - 1]);// 如果当前元素已经存在于 set 中,说明找到了重复的元素,返回 trueif(!set.add(nums[i])) return true;}// 如果没有找到符合条件的重复元素,返回 falsereturn false;}
}
解析:

思路核心:

  • HashSet存储当前滑动窗口中的元素:

    • set 是用来存储当前窗口中的元素。如果 set 中已经存在当前元素,则说明找到了一个重复元素,并且这个元素满足索引差不超过 k,因此返回 true
  • 滑动窗口的维护:

    • 使用 if (i > k) 来控制滑动窗口的大小,确保窗口中最多包含 k 个元素。当索引 i 大于 k 时,意味着滑动窗口的左边界已经移动,需要移除 set 中索引 i - k - 1 位置的元素,即 set.remove(nums[i - k - 1])。这样保证了窗口大小不会超过 k
  • 判断重复元素:

    • set.add(nums[i]) 如果当前元素已经在 set 中存在,add 方法会返回 false,表示没有成功添加新元素,此时就说明找到了重复元素,返回 true
    • 如果 set.add(nums[i]) 返回 true,则说明当前元素不重复,继续遍历下一个元素。
  • 返回 false

    • 如果遍历完所有元素后都没有找到重复元素,则返回 false

2.2存在重复数字plus 

2.2.1题目

220. 存在重复元素 III - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/contains-duplicate-iii/description/?envType=problem-list-v2&envId=sliding-window

2.2.2代码 

class Solution {public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {int n = nums.length;// 创建一个 TreeSet 来存储滑动窗口中的元素TreeSet<Long> set = new TreeSet<Long>();// 遍历 nums 数组中的每个元素for (int i = 0; i < n; i++) {// 检查滑动窗口中是否存在满足条件的元素Long ceiling = set.ceiling((long) nums[i] - (long) t);// 如果找到一个元素满足条件,返回 trueif (ceiling != null && ceiling <= (long) nums[i] + (long) t) {return true;}// 将当前元素添加到 TreeSet 中set.add((long) nums[i]);// 保持滑动窗口的大小为 k,如果当前索引 i 大于或等于 k// 则移除窗口中最左边的元素if (i >= k) {set.remove((long) nums[i - k]);}}// 如果遍历完所有元素后都没有找到满足条件的元素对,返回 falsereturn false;}
}

2.2.3解析 

 核心思路:

  • TreeSet 用于查找邻近元素: TreeSet 是一个有序集合,它根据元素的大小自动排列,因此可以快速查找给定范围内的元素。这里,我们使用 ceiling 方法来查找大于等于 nums[i] - t 的最小元素,如果这个元素与当前 nums[i] 的差小于等于 t,则满足题目条件,返回 true

  • 滑动窗口: 我们维护一个大小为 k 的滑动窗口。每次遍历一个新元素时,先在 TreeSet 中查找该元素的邻近值(是否满足条件),然后将当前元素添加到窗口中。为了保持窗口大小为 k,如果当前索引大于等于 k,则移除窗口中最左边的元素。这样,滑动窗口始终保持最新的 k 个元素。

 让我们来模拟一下,假设我们有以下数组:

nums = [1, 5, 9, 1, 5, 9], k = 2, t = 3

在这个例子中,滑动窗口的大小是 2(即最多允许相隔 2 个元素),并且差值要求不超过 3。我们按顺序处理每个元素,检查是否存在符合条件的元素对。

  1. 对于 nums[0] = 1set 为空,直接将 1 添加到 set
  2. 对于 nums[1] = 5,我们查找 set 中是否存在元素 >= 5 - 3 = 2,并且该元素应小于等于 5 + 3 = 8。在 set 中没有满足条件的元素,所以将 5 添加到 set
  3. 对于 nums[2] = 9,我们查找 set 中是否存在元素 >= 9 - 3 = 6,并且该元素应小于等于 9 + 3 = 12。找到 5,它满足条件,所以返回 true

因此,这个例子会返回 true,因为存在元素对 (5, 9),它们的差值为 4,满足 k=2t=3

3.小结

今天的分享到这里就结束了,喜欢的小伙伴不要忘记点点赞点个关注,你的鼓励就是对我最大的支持,加油!

相关文章:

Java算法OJ(11)双指针练习

目录 1.前言 2.正文 2.1存在重复数字 2.1.1题目 2.1.2解法一代码 解析&#xff1a; 2.1.3解法二代码 解析&#xff1a; 2.2存在重复数字plus 2.2.1题目 2.2.2代码 2.2.3解析 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来给大家分享双指针算法的相关练习&…...

44.扫雷第二部分、放置随机的雷,扫雷,炸死或成功 C语言

按照教程打完了。好几个bug都是自己打出来的。比如统计周围8个格子时&#xff0c;有一个各自加号填成了减号。我还以为平移了&#xff0c;一会显示是0一会显示是2。结果单纯的打错了。debug的时候断点放在scanf后面会顺畅一些。中间多放一些变量名方便监视。以及mine要多显示&a…...

大语言模型LLM的微调代码详解

代码的摘要说明 一、整体功能概述 这段 Python 代码主要实现了基于 Hugging Face Transformers 库对预训练语言模型&#xff08;具体为 TAIDE-LX-7B-Chat 模型&#xff09;进行微调&#xff08;Fine-tuning&#xff09;的功能&#xff0c;使其能更好地应用于生成唐诗相关内容的…...

钉钉与企业微信机器人:助力网站定时任务高效实现

钉钉、企业微信机器人在网站定时任务中的应用&#xff0c;主要体现在自动化通知、提醒以及数据处理等方面。 以下是一些具体的应用场景&#xff1a; 1. 自动化通知 项目进度提醒&#xff1a;在蒙特网站所负责的软件开发或网站建设项目中&#xff0c;可以利用机器人设置定时任…...

自然语言处理工具-广告配音工具用于语音合成助手/自媒体配音/广告配音/文本朗读-已经解锁了 全功能的 apk包

Android -「安卓端」 广告配音工具用于语音合成助手/自媒体配音/广告配音/文本朗读。 广告配音工具&#xff1a;让您的文字“说话”&#xff0c;在这个快速发展的数字时代&#xff0c;广告配音工具为各种语音合成需求提供了一站式解决方案。无论是自媒体配音、商业广告配音、…...

深入解析注意力机制

引言随着深度学习的快速发展&#xff0c;注意力机制&#xff08;Attention Mechanism&#xff09;逐渐成为许多领域的关键技术&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;中。其核心思想是赋予模型“关注重点”的能力…...

Unity图形学之雾Fog

1.设置雾化&#xff1a; 2.雾化变化曲线&#xff1a;FogMode &#xff08;1&#xff09;线性&#xff1a; &#xff08;2&#xff09;一次指数&#xff1a; &#xff08;3&#xff09;二次指数&#xff1a; Shader "Custom/FogTest" {Properties{_Color ("Color…...

【大数据学习 | Spark-Core】详解Spark的Shuffle阶段

1. shuffle前言 对spark任务划分阶段&#xff0c;遇到宽依赖会断开&#xff0c;所以在stage 与 stage 之间会产生shuffle&#xff0c;大多数Spark作业的性能主要就是消耗在了shuffle环节&#xff0c;因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。 负责shuffle…...

如何启动 Docker 服务:全面指南

如何启动 Docker 服务:全面指南 一、Linux 系统(以 Ubuntu 为例)二、Windows 系统(以 Docker Desktop 为例)三、macOS 系统(以 Docker Desktop for Mac 为例)四、故障排查五、总结Docker,作为一种轻量级的虚拟化技术,已经成为开发者和运维人员不可或缺的工具。它允许用…...

使用client-go在命令空间test里面对pod进行操作

目录 一、获取使用restApi调用的token信息 二、client-go操作pod示例 1、获取到客户端 2、创建pod 3、获取test命令空间的所有pod 4、获取某个具体pod的详细信息 5、更新pod 6、删除pod 三、总结 官方参考地址&#xff1a;https://kubernetes.io/docs/reference/kuber…...

Linux中网络文件系统nfs使用

一、nfs服务 NFS&#xff08;Network File System&#xff09; 是一种用于在网络中共享文件的协议&#xff0c;允许不同操作系统&#xff08;如 Linux、Unix、MacOS 等&#xff09;之间进行文件共享。 NFS 的工作原理基于客户端-服务器模型&#xff0c;服务器提供共享文件系统…...

气膜建筑:打造全天候安全作业空间,提升工程建设效率—轻空间

在现代建筑工程中&#xff0c;施工环境的管理和作业效率是决定项目进度和质量的关键因素。然而&#xff0c;施工过程中常常会受到天气变化的影响&#xff0c;诸如大风、雨雪、沙尘等恶劣天气常常延误工期&#xff0c;增加施工难度。为了解决这一问题&#xff0c;气膜建筑以其独…...

【HarmonyOS学习日志(10)】一次开发,多端部署之功能级一多开发,工程级一多开发

功能级一多开发 SysCap机制介绍 HarmonyOS使用SysCap机制&#xff08;即SystemCapability&#xff09;&#xff0c;可以帮助开发者仅关注设备的系统能力&#xff0c;而不用考虑成百上千种具体的设备类型。 在过去&#xff0c;开发不同设备上的应用就用不同设备的SDK进行开发&…...

dmdba用户资源限制ulimit -a 部分配置未生效

dmdba用户资源限制ulimit -a 部分配置未生效 1 环境介绍2 数据库实例日志报错2.1 mpp01 实例日志报错2.2 mpp02 实例日志报错 3 mpp02 服务器资源限制情况4 关闭SELinux 问题解决4.1 临时关闭 SELinux4.2 永久关闭 SELinux 5 达梦数据库学习使用列表 1 环境介绍 Cpu x86 Os Ce…...

【Code First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列 &#x1f…...

如何在谷歌浏览器中切换DNS服务器

在浏览网页时&#xff0c;DNS&#xff08;域名系统&#xff09;服务器的作用是将您输入的网址转换为计算机可以理解的IP地址。有时&#xff0c;您可能需要更改默认的DNS服务器以提升网络速度或解决访问问题。本文将详细介绍如何在谷歌浏览器中切换DNS服务器&#xff0c;并在此过…...

Spring Cloud Stream实现数据流处理

1.什么是Spring Cloud Stream&#xff1f; Spring Cloud Stream的核心是Stream&#xff0c;准确来讲Spring Cloud Stream提供了一整套数据流走向&#xff08;流向&#xff09;的API&#xff0c; 它的最终目的是使我们不关心数据的流入和写出&#xff0c;而只关心对数据的业务处…...

列表上移下移功能实现

后台管理某列表需实现上移下移功能&#xff0c;并与前端展示列表排序相关。 现将开发完成过程笔记记录下来。 目录 列表增加属性 JQuery脚本 服务端 控制器 服务层 总结 列表增加属性 在循环渲染时&#xff0c;在table表格的tr上增加id和排序的属性值&#xff0c;以便传…...

升级智享 AI 直播三代:领航原生直播驶向自动化运营新航道

在瞬息万变的数字商业世界&#xff0c;直播行业恰似一艘破浪前行的巨轮&#xff0c;原生直播作为初始 “航船”&#xff0c;在历经风雨后&#xff0c;终于迎来智享 AI 直播三代这股强劲 “东风”&#xff0c;校准航向&#xff0c;开启自动化运营的全新航道&#xff0c;驶向一片…...

Llmcad: Fast and scalable on-device large language model inference

题目&#xff1a;Llmcad: Fast and scalable on-device large language model inference 发表于2023.09 链接&#xff1a;https://arxiv.org/pdf/2309.04255 声称是第一篇speculative decoding边缘设备的论文&#xff08;不一定是绝对的第一篇&#xff09;&#xff0c;不开源…...

Veo 2提示词效能跃迁实战(工业级Prompt链构建全图谱)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Veo 2提示词编写的核心范式演进 Veo 2作为新一代视频生成模型&#xff0c;其提示词&#xff08;prompt&#xff09;工程已从早期的“关键词堆叠”转向结构化、语义分层与意图对齐的复合范式。这一演进并非简…...

GEMM内核与MHA中的寄存器分配优化策略

1. GEMM内核与寄存器分配基础解析通用矩阵乘法&#xff08;GEMM&#xff09;作为深度学习计算的核心算子&#xff0c;其性能表现直接决定了神经网络训练和推理的效率。在硬件层面&#xff0c;寄存器分配的优劣往往能带来数倍的性能差异。我们以典型的GEMM运算C αAB βC为例&…...

软阴影:那个让虚拟世界“温柔起来“的光影小秘密

一、从一只小猫的影子说起 前几天我在朋友家做客&#xff0c;他家养了一只胖乎乎的橘猫&#xff0c;正趴在阳台的窗边晒太阳。我无意间瞥了一眼那只猫脚边的影子&#xff0c;突然被一个细节震撼了—— 那只猫的影子——并不是一片均匀的黑。 仔细看——猫肚子紧贴地板的地方——…...

2026 新视角:化妆品开发的底层逻辑,做好一款产品,从选对原料开始

在化妆品研发链条中&#xff0c;配方架构、生产工艺、包装设计固然重要&#xff0c;但决定一款产品上限的&#xff0c;永远是原料。一款稳定、安全、表现优异的护肤成品&#xff0c;离不开纯净、达标、批次一致的优质原料。对于品牌方、配方师、代工企业而言&#xff0c;原料不…...

Win10系统清理避坑指南:你的BAT脚本真的安全吗?盘点那些不能乱删的文件

Win10系统清理避坑指南&#xff1a;BAT脚本安全操作手册每次看到那些号称"一键清理系统垃圾"的BAT脚本在技术论坛被疯狂转发&#xff0c;我的工程师朋友老张就会忍不住摇头。上周他刚帮一位设计师修复了崩溃的Photoshop——原因正是某个清理脚本删除了Adobe的临时工作…...

录音会议纪要整理不同使用场景,实用口碑选择建议

针对不同场景的录音整理需求&#xff08;短录音、中长录音、长内容深度整理&#xff09;&#xff0c;本文基于实际使用体验&#xff0c;分享不同场景下的工具选择建议与使用心得。一、场景一&#xff1a;短录音&#xff08;15-60分钟&#xff0c;发音清晰&#xff09;典型场景&…...

全链路压测实战:双十一级别的流量,我是这样扛住的

作为一名在质量保障领域摸爬滚打多年的测试工程师&#xff0c;我深知传统的单接口压测在如今分布式架构下的无力感。当业务流量达到双十一这种脉冲式、高并发的级别时&#xff0c;任何一个非核心链路上的“短板”都可能引发系统性的雪崩。全链路压测不再是选择题&#xff0c;而…...

AI算力要上天?别笑,太空数据中心真能干翻地球电费!

前言你有没有算过&#xff0c;训练一个大模型&#xff0c;相当于烧掉多少吨煤&#xff1f;如今AI狂飙突进&#xff0c;算力需求指数级增长&#xff0c;可地球上的电——不够用了&#xff01;更别说建个数据中心还得跟地方政府“斗智斗勇”&#xff0c;抢地皮、配储能、扛审批&a…...

GEO生成引擎优化:当AI成为信息分发的主角,品牌如何抢占对话窗口?

当用户不再"搜索-浏览"&#xff0c;而是直接"AI提问-获取答案"&#xff0c;传统SEO的逻辑正在被彻底改写。2026年&#xff0c;GEO&#xff08;Generative Engine Optimization&#xff0c;生成式引擎优化&#xff09;已经从概念走向规模化落地。本文从技术…...

账务台账数据

银行里说的 “账务台账数据”&#xff0c;本质就是按会计规则把每笔业务逐笔、分户、分科目记下来的完整明细流水 余额 辅助信息&#xff0c;核心是 “可逐笔追溯、可对账、可审计” 的一套明细数据。下面用通俗、具体的方式拆开说&#xff1a;一、银行 “账务台账” 到底是什…...