LeetCode 220 存在重复元素 III 题解

LeetCode 220 存在重复元素 III 题解

题目描述

给定一个整数数组 nums 和两个整数 k 和 t,请判断数组中是否存在两个不同的索引 i 和 j,使得:

  1. abs(nums[i] - nums[j]) <= t
  2. abs(i - j) <= k

方法思路:桶排序 + 滑动窗口

核心思想

  1. 桶排序思想:将数值范围划分为大小为t+1的桶

    • 每个元素根据值分配到对应的桶(编号 = 值 // (t+1))

    • 同一桶内的元素自然满足差值条件

    • 相邻桶的元素需要额外验证差值,
      相邻桶要验证额外差值的具体原因和实现逻辑:

      1.1 桶的划分方式 每个桶的宽度是 t + 1 (w = t + 1),桶编号通过 数值 // w 计算得到。这种划分方式导致:

        - 同一桶内元素的差值 一定 ≤ t (自动满足条件)- 相邻桶中元素 可能满足差值 ≤ t
      

      1.2. 边界情况示例 假设 t=3(w=4),数值分布:

        - 桶0:[0-3]- 桶1:[4-7]- 桶-1:[-4--1]当出现:- 数值3(桶0)和4(桶1) → 差1 ≤ 3- 数值-1(桶-1)和0(桶0) → 差1 ≤ 3
      

      1.3 必须显式验证的原因 相邻桶中的元素不一定满足差值条件(比如桶0的3和桶1的7差4>3),因此需要通过 abs(nums[i] - bucket_value) < w 的二次验证,确保实际差值 ≤ t
      1.4. 算法完整性 这种设计保证三种可能性都被覆盖:

        - ✅ 同桶元素 → 直接返回- ✅ 左邻桶元素 → 验证后返回- ✅ 右邻桶元素 → 验证后返回
      
  2. 滑动窗口:维护大小为k的窗口

    • 使用字典记录当前窗口内的元素
    • 当窗口超过k个元素时,删除最早进入的元素

算法步骤

  1. 处理非法输入(t < 0)
  2. 初始化桶字典和桶宽度w = t + 1
  3. 遍历数组元素:
    • 计算当前元素的桶编号
    • 检查当前桶和相邻桶是否满足条件
    • 维护滑动窗口大小(删除过期元素)

复杂度分析

  • 时间复杂度:O(n),每个元素处理时间为O(1)
  • 空间复杂度:O(min(n,k)),滑动窗口最多保存k个元素

关键点说明

  1. 桶宽度选择t+1的宽度保证了:

    • 同一桶内元素差≤t
    • 相邻桶元素需要显式验证差值
  2. 滑动窗口维护

    if i >= k:expired_bucket = nums[i - k] // wdel bucket[expired_bucket]
    

这保证了任何时候桶中只包含最近k个元素

  1. 负数处理 :Python的整数除法是向下取整,例如:
    • -3 // 4 = -1 (而正数3//4=0)
    • 这确保了相邻负数的正确分桶

示例输入

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

输出应为False,因为虽然存在相同元素,但索引差超过k的限制

LeetCode 220 存在重复元素 III

https://leetcode.cn/problems/7WqeDu/

解法:桶排序 + 滑动窗口 时间复杂度O(n) 空间复杂度O(min(n,k))

# LeetCode 220 存在重复元素 III
# https://leetcode.cn/problems/7WqeDu/
# 解法:桶排序 + 滑动窗口 时间复杂度O(n) 空间复杂度O(min(n,k))from typing import Listclass Solution:def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:"""判断数组中是否存在满足以下条件的两个不同索引i,j:1. abs(nums[i] - nums[j]) <= t2. abs(i - j) <= k参数:nums: 输入数组k: 索引最大差值(滑动窗口大小)t: 数值最大差值返回:bool: 是否存在满足条件的元素对"""if t < 0:  # 处理非法输入,t不能为负数return Falsen = len(nums)bucket = {}  # 用字典维护桶,键为桶编号,值为桶中元素值w = t + 1    # 桶的宽度(避免t=0时除零错误)for i in range(n):# 计算当前元素所属的桶编号bucket_id = nums[i] // w  # 整数除法自动向下取整# 检查当前桶是否已有元素(保证数值差<=t)if bucket_id in bucket:return True# 检查左侧相邻桶(需要额外验证数值差)if (bucket_id - 1) in bucket and abs(nums[i] - bucket[bucket_id - 1]) < w:return True# 检查右侧相邻桶(需要额外验证数值差)if (bucket_id + 1) in bucket and abs(nums[i] - bucket[bucket_id + 1]) < w:return True# 将当前元素加入桶bucket[bucket_id] = nums[i]# 维护滑动窗口,当i>=k时删除最早进入桶的元素if i >= k:expired_bucket = nums[i - k] // wdel bucket[expired_bucket]return Falseif __name__ == "__main__":# 测试用例(题目示例)nums = [1, 5, 9, 1, 5, 9]k = 2t = 3print(Solution().containsNearbyAlmostDuplicate(nums, k, t))  # 预期输出:False

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

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

相关文章

路由器详细讲解

目录 一、路由器的定义和基本功能 二、路由器的分类 三、路由器的工作原理 四、路由器的配置 五、路由器的选购要点 路由器是一种网络设备&#xff0c;它在计算机网络中扮演着至关重要的角色&#xff0c;主要用于连接不同的网络&#xff0c;并根据数据包的目的地址选择合适…

Spring MVC @CookieValue 注解怎么用?

CookieValue 注解的作用 CookieValue 注解用于将 HTTP 请求中特定 Cookie 的值绑定到 Controller 方法的参数上。 Cookies 是由服务器发送到用户浏览器并保存在本地的一小块数据。浏览器在后续向同一服务器发送请求时&#xff0c;会通过 Cookie 请求头将这些数据再带回给服务…

控制mac地址表端口安全

一、端口安全的核心理论 安全MAC地址类型 安全动态MAC&#xff1a;启用端口安全后动态学习的MAC地址&#xff0c;设备重启后丢失&#xff0c;需重新学习。 安全静态MAC&#xff1a;手动配置的MAC地址&#xff0c;永久生效且不会被老化。 Sticky MAC&#xff1a;动态学习后自动…

【wpf】10 C#树形控件高效实现:递归构建与路径查找优化详解

在WPF应用程序开发中&#xff0c;树形控件的实现是常见且具有挑战性的需求。本文将深入解析一套高效树形结构的实现方案&#xff0c;包含递归构建、路径查找优化、动态交互等多个关键技术点。 一、递归构建树形结构 private TreeItem CreateTreeViewItem(TreeNode node) {var…

面向未来的 TCP 协议设计:可扩展与兼容并存

目录 1.设计思路 &#xff08;1&#xff09;完整数据结构&#xff08;字节布局&#xff09; 1&#xff09;字段解释&#xff1a; 2&#xff09;Flags字段设计&#xff08;1字节位图&#xff09; &#xff08;2&#xff09;进阶版 Java 解码器实现&#xff08;示例&#xf…

MCP 入门指南

文章来源&#xff1a;https://anmolbaranwal.com/ 本文涵盖内容如下&#xff1a; 现有AI工具的问题。MCP及其核心组件介绍。MCP 内部是如何工作的&#xff1f;MCP 解决的问题以及它为何重要。MCP 的 3 个层&#xff08;以及我最终如何理解它们&#xff09;。使用内置 Auth 连接…

第 14 届蓝桥杯 C++ 青少组省赛中 / 高级组真题解析

一、选择题 第 1 题 题目&#xff1a;C 中&#xff0c;bool 类型的变量占用字节数为&#xff08; &#xff09;。 A. 1 B. 2 C. 3 D. 4 答案&#xff1a;A 解析&#xff1a; C 标准规定&#xff0c;bool类型至少占用 1 字节&#xff08;1 byte&#xff09;&#xff0c;用于存…

使用 Selenium 爬取动态网页数据 —— 实战与坑点详解

本文记录了笔者在爬取网页数据过程中遇到的各种技术挑战&#xff0c;包括页面动态渲染、JavaScript 注入等问题&#xff0c;并最终给出一个可运行的完整方案。 文章目录 网页获取不到数据&#x1f680; 尝试用 Selenium 渲染页面 网页获取不到数据 某网页数据依赖大量 JavaSc…

【信息系统项目管理师】法律法规与标准规范——历年考题(2024年-2020年)

手机端浏览☞【信息系统项目管理师】法律法规与标准规范——历年考题&#xff08;2024年-2020年&#xff09; 2024年上半年综合知识【占比分值3′】 42、关于招标投标的描述&#xff0c;不正确的是&#xff08;属于同一集团组织成员的投标人可以按照该组织要求协同投标&#xf…

多模态大语言模型arxiv论文略读(五十六)

DesignQA: A Multimodal Benchmark for Evaluating Large Language Models’ Understanding of Engineering Documentation ➡️ 论文标题&#xff1a;DesignQA: A Multimodal Benchmark for Evaluating Large Language Models’ Understanding of Engineering Documentation …

Docker 渡渡鸟镜像同步站 使用教程

Docker 渡渡鸟镜像同步站 使用教程 &#x1f680; 介绍 Docker.aityp.com&#xff08;渡渡鸟镜像同步站&#xff09;是一个专注于为国内开发者提供 Docker 镜像加速和同步服务的平台。它通过同步官方镜像源&#xff08;如 Docker Hub、GCR、GHCR 等&#xff09;&#xff0c;为…

Unity:AddTorque()(增加旋转力矩)

目录 什么是 AddTorque()&#xff1f; 第一性原理出发&#xff1a;什么是 Torque&#xff08;力矩&#xff09;&#xff1f; Torque 公式 Unity 中 AddTorque 的工作原理 参数属性 &#x1f50d; Linear Drag&#xff08;线性阻力&#xff09; 线性阻力模拟的现实情况&…

async/await的另一种食用方法

在JavaScript/TypeScript的异步编程中&#xff0c;async/await让我们的代码看起来更像是同步的&#xff0c;极大地提高了可读性。然而&#xff0c;错误处理仍然是一个需要仔细考虑的问题。今天我要分享一种优雅的错误处理模式&#xff0c;它能让你的异步代码更加简洁。 传统tr…

计算机网络 - stp生成树实验

【实验假设】 我们使用 Cisco Packet Tracer 或类似的模拟软件&#xff0c;或物理的 Cisco 交换机。 交换机初始为默认配置&#xff08;或已通过 write erase 和 reload 清除配置&#xff09;。 PC 已配置 IP 地址如下&#xff08;示例&#xff09;&#xff1a; PC0: 192.168…

浅析 Spring 中 FactoryBean 的实现与使用

浅析 Spring 中 FactoryBean 的实现与使用 一、FactoryBean核心机制剖析二、高级应用场景与实战三、框架级应用案例解析四、FactoryBean常见面试题 一、FactoryBean核心机制剖析 1. 本质与双重角色 FactoryBean是Spring容器中用于定制化对象创建的核心接口&#xff08;org.spri…

vue3 element-plus 输入框回车跳转页面问题处理

问题描述&#xff1a; 当页面搜索条件只有一个的情况下&#xff0c;输入框不管有没有值&#xff0c;回车后会跳转页面 解决办法&#xff0c;给表单添加 submit.prevent <el-form ref"ruleForm" :model"search" label-width"120px" class&qu…

(51单片机)LCD展示动画(延时函数)(LCD1602教程)

前言&#xff1a; 前面我们说过&#xff0c;之前LCD1602模块有点难&#xff0c;但是现在&#xff0c;我们通过几遍博客的学习&#xff0c;今天来讲一下LCD1602的原理 演示视频&#xff1a; LCD1602流动 源代码&#xff1a; main.c #include <STC89C5xRC.H> #include &q…

深入了解 OpenIddict:实现 OAuth 2.0 和 OpenID Connect 协议的 .NET 库

在现代 Web 开发中&#xff0c;身份验证和授权是安全性的重要组成部分。随着对安全性的要求不断增加&#xff0c;OAuth 2.0 和 OpenID Connect&#xff08;OIDC&#xff09;协议已经成为许多应用程序的标准身份验证方式。而 OpenIddict&#xff0c;作为一个用于实现 OAuth 2.0 …

【C++游戏引擎开发】第30篇:物理引擎(Bullet)—软体动力学系统

一、软体动力学理论体系 1.1 连续体力学基础 1.1.1 变形梯度张量 物体运动可描述为映射函数: x = ϕ ( X , t ) \mathbf{x} = \phi(\mathbf{X},t) x

Android Compose 层叠布局(ZStack、Surface)源码深度剖析(14)

Android Compose 层叠布局&#xff08;ZStack、Surface&#xff09;源码深度剖析 一、引言 在 Android 应用开发领域&#xff0c;用户界面&#xff08;UI&#xff09;的设计与实现一直是至关重要的环节。随着技术的不断演进&#xff0c;Android Compose 作为一种全新的声明式…