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.pswp.cn/bicheng/80138.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80138.shtml
英文地址,請注明出處:http://en.pswp.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 作為一種全新的聲明式…