二分查找篇——在排序數組中查找元素的第一個和最后一個位置【LeetCode】

34. 在排序數組中查找元素的第一個和最后一個位置

一、算法邏輯(逐步通順講解每一步思路)

該算法用于在一個升序排列的數組 nums 中查找某個目標值 target第一個出現的位置和最后一個出現的位置

? 1?? 定義 lower_bound 函數

def lower_bound(self, nums: List[int], target: int) -> int:left, right = -1, len(nums)while left + 1 < right:mid = (left + right) // 2if nums[mid] >= target:right = midelse:left = midreturn right
  • 這個函數返回的是第一個大于等于 target 的索引位置
  • 使用的是左閉右開區間?[left+1, right)?的二分寫法,可以避免邊界處理錯誤。
  • 循環終止時,right?就是第一個滿足?nums[right] >= target?的位置。

? 2?? 查找目標值的起始位置

start = self.lower_bound(nums, target)
  • 如果?nums[start] != target?或者?start == len(nums),說明數組中不存在該元素,直接返回?[-1, -1]

? 3?? 查找目標值的結束位置

end = self.lower_bound(nums, target + 1) - 1
  • 我們通過查找?target + 1?的第一個位置,再減 1,就得到了?target?的最后一個位置。
  • 因為數組是有序的,所以?target + 1?第一次出現之前的所有元素都是?target

? 4?? 返回結果

return [start, end]

二、核心點總結

? 利用兩次二分查找精準定位范圍

  • 使用兩次「lower_bound」分別找到起始位置和結束位置,避免了線性掃描,效率高。

? 巧妙的“target + 1”技巧

  • 不需要額外編寫一個 upper_bound 函數,只需將目標值加一,即可復用 lower_bound 找出右邊界。

? 適合面試高頻題型

  • 本題是典型的二分查找變形題,考察對邊界條件的理解和對二分思想的靈活運用。

? 可擴展性強

  • 此種思路也可推廣到其他變種問題,如:統計某數字在排序數組中出現的次數(劍指 Offer 題)等。
class Solution:def lower_bound(self, nums:List[int], target:int)-> int:left, right = -1, len(nums)while left+1 < right:mid = (left+right)//2if nums[mid]>=target:right = midelse:left = midreturn rightdef searchRange(self, nums: List[int], target: int) -> List[int]:start = self.lower_bound(nums, target)if start==len(nums) or nums[start] != target:return [-1,-1]end = self.lower_bound(nums, target+1)-1return [start, end]

三、時間復雜度分析

? 每次調用 lower_bound 是一個標準的二分查找過程:

  • 時間復雜度為 O(log n)

? 整體算法執行了兩次二分查找:

  • 總體時間復雜度為?O(log n)

四、空間復雜度分析

? 整個過程中沒有使用任何額外的數據結構:

  • 所有變量都是常數級的局部變量

? 空間復雜度為 O(1)


? 總結一句話

這段算法通過兩次二分查找定位目標值的起始與結束位置,巧妙利用 target + 1 技巧避免重復編寫 upper_bound,具有高效、簡潔、穩定的特點,是解決有序數組中查找范圍類問題的經典解法之一,非常適合作為面試準備的重點內容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913729.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913729.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913729.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【深度學習新浪潮】AI在材料力學領域的研究進展一覽

一、材料力學的研究范疇 材料力學是固體力學的核心分支,聚焦于材料在載荷作用下的變形、失效規律及性能優化,其核心任務是揭示材料的強度、剛度和穩定性機制。具體研究內容包括: 基本力學行為:分析桿、梁、軸等結構在拉伸、壓縮、彎曲、扭轉等載荷下的應力分布與應變響應。…

WPF之命令

命令的定義&#xff1a;命令與事件的區別&#xff1a;命令是具有約束性的。命令還可以控制接收者"先做校驗&#xff0c;再保存&#xff0c;再關閉"。命令&#xff1a;WPF的命令&#xff0c;實際上就是實現了ICommand接口的類&#xff0c;平時使用最多的是RoutedComma…

百度文心一言開源大模型ERNIE-4.5-0.3B-PT深度測評

號外號外&#xff01;6月30號&#xff0c;百度文心一言官宣開源ERNIE 4.5大模型&#xff01;&#xff01;&#xff01; 一收到這個消息&#xff0c;博主就立馬從GitCode拉了個模型&#xff0c;本地私有化部署體驗了一下&#xff0c;一個字&#xff0c;酷&#xff01; 鑒于絕大…

零基礎,使用Idea工具寫一個郵件報警程序

打開idea&#xff0c;創建一個project打開文件目錄下的pom.xml文件&#xff0c;添加下面的內容安裝依賴&#xff0c;等待下載完成<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> &…

字體 Unicode 區塊字符展示 PDF 生成器

Unicode 字體字符集可視化工具 - 代碼介紹 項目概述 這個工具是一個用于分析和可視化字體文件中包含的 Unicode 字符的實用程序&#xff0c;能夠掃描指定字體文件&#xff0c;提取其中包含的所有 Unicode 字符&#xff0c;并按 Unicode 區塊分類生成 PDF 文檔&#xff0c;直觀展…

第4章:實戰項目一 打造你的第一個AI知識庫問答機器人 (RAG)

各位老鐵&#xff0c;歡迎來到我們專欄的第一個實戰項目。 在過去的三個章節里&#xff0c;我們已經完成了所有的理論儲備和環境搭建。我們理解了LLM的本質&#xff0c;掌握了Prompt Engineering的要領&#xff0c;洞悉了Embedding和向量數據庫的魔力&#xff0c;并且熟悉了La…

身份證識別api-便捷生活與安全社會的雙重保障

身份證識別技術是人工智能和圖像處理領域的杰出產物之一&#xff0c;正逐步滲透到我們生活的方方面面。而最直觀的作用就是簡化身份證驗證流程。現如今&#xff0c;無論是銀行開戶、酒店入住還是政務辦理、線上支付&#xff0c;都需要輸入 身份證信息進行身份驗證&#xff0c;傳…

跨國企業進入中國市場:如何利用亞馬遜云科技文檔 MCP 服務器解決區域差異問題

業務場景 想象一下&#xff0c;您是一家美國科技公司的 IT 架構師&#xff0c;公司剛剛決定將業務擴展到中國市場。作為技術負責人&#xff0c;您需要規劃如何將現有的基于亞馬遜云科技的應用遷移到中國區域。然而&#xff0c;您很快發現中國區的云服務環境與您熟悉的全球區域…

WPF使用WebBrowser 解決href標簽target=_blank在瀏覽器窗口打開新鏈接而非窗體內部打開的問題

前言 最近在WPF中使用WebBrowser控件顯示網頁的時候遇到一個問題,由于網頁里面有大規模的連接標簽使用了target=_blank的屬性,導致打開的網頁不是在我們的程序內部,而是調用系統瀏覽器打開了我們的網頁內容,這種情況非常的影響用戶體驗。于是就有了這篇文章內容。本文將詳細…

制作MikTex本地包可用于離線安裝包

MikTex安裝包版本是basic-miktex-24.1-x64.exe。注&#xff1a;basic版本表示只安裝MikTex基本包&#xff0c;不安裝全部包。在能夠聯網的電腦上安裝MikTex軟件后&#xff0c;可以按以下步驟制作本地包庫。一、制作本地包庫1、新建一個文件夾&#xff0c;比如在D盤新建miktex-l…

Redis基礎的介紹與使用(一)(Redis簡介以及Redis下載和安裝)

0 引言 本系列用于和大伙兒一起入門Redis&#xff0c;主要包括Redis的下載&#xff0c;分別在終端&#xff0c;圖形顯示界面以及JAVA代碼中進行使用&#xff0c;適合給需要快速了解Redis是什么以及上手使用的朋友們&#xff0c;希望我用最簡單的語言來講清楚相關內容&#xff…

七牛云C++開發面試題及參考答案

智能指針的原理及應用場景是什么&#xff1f; 智能指針是 C 中用于管理動態分配內存的工具&#xff0c;其核心原理是通過 RAII&#xff08;資源獲取即初始化&#xff09;技術&#xff0c;將堆內存的生命周期與對象的生命周期綁定&#xff0c;從而避免手動管理內存帶來的內存泄…

【Python辦公】Excel橫板表頭轉豎版通用工具(GUI版本)橫向到縱向的數據重構

目錄 專欄導讀前言項目概述功能特性技術棧核心代碼解析1. 類結構設計2. 界面布局設計3. 滾動列表實現4. 數據轉換核心邏輯5. 預覽功能實現設計亮點1. 用戶體驗優化2. 技術實現優勢3. 代碼結構優勢使用場景擴展建議總結完整代碼結尾專欄導讀 ?? 歡迎來到Python辦公自動化專欄—…

C#項目 在Vue/React前端項目中 使用使用wkeWebBrowser引用并且內部使用iframe網頁外鏈 頁面部分白屏

如果是使用wkeWebBrowser的引用方式 非常有可能是版本問題導致的 問題分析 1. wkeWebBrowser 的局限性 不支持或不完全支持 ES6 語法&#xff08;如 let, const, Promise, async/await&#xff09; 缺少對現代 Web API 的支持&#xff08;如 Intl, fetch, WebSocket&#xff0…

系統架構設計師論文分享-論微服務架構

我的軟考歷程 摘要 2023年2月&#xff0c;我所在的公司通過了研發紗線MES系統的立項&#xff0c;該系統為國內紗線工廠提供SAAS服務&#xff0c;旨在提高紗線工廠的數字化和智能化水平。我在該項目中擔任系統架構設計師一職&#xff0c;負責該項目的架構設計工作。本文結合我…

The History of Big Data

數據洪流悄然重塑世界的進程中&#xff0c;大數據的歷史是技術迭代與需求驅動的交響。從 2003 年分布式系統雛形初現&#xff0c;到 Hadoop 掀起開源浪潮&#xff0c;再到 Spark、容器化技術與深度學習的接力革新&#xff0c;以及 Hadoop 生態的興衰起落&#xff0c;大數據發展…

【JS逆向基礎】數據分析之正則表達式

前言&#xff1a;前面介紹了關于JS逆向所需的基本知識&#xff0c;比如前端三件套等&#xff0c;從這里開始就要進入到數據分析的范圍內了&#xff0c;當然對于一些小白而言一些基本的知識還是需要知道的&#xff0c;比如正則&#xff0c;XPATNY與BS4&#xff1b;三個內容用三篇…

Mac mini 高性價比擴容 + Crossover 游戲實測 全流程手冊

Mac mini 高性價比擴容 Crossover 游戲實測 全流程手冊 本文將圖文并茂地指導你如何&#xff1a; 為 M4 Mac mini 外置擴容&#xff08;綠聯 USB4 硬盤盒 致態 TiPlus7100&#xff09;安裝并配置 Crossover/Whisky 運行 Windows 應用實測游戲運行性能、診斷常見異常一、準備工…

【PyTorch】PyTorch中torch.nn模塊的卷積層

PyTorch深度學習總結 第七章 PyTorch中torch.nn模塊的卷積層 文章目錄PyTorch深度學習總結前言一、torch.nn模塊1. 模塊的基本組成部分1.1 層&#xff08;Layers&#xff09;1.2 損失函數&#xff08;Loss Functions&#xff09;1.3 激活函數&#xff08;Activation Functions…

Rust簡潔控制流:if let與let else高效編程指南

文章目錄Rust簡潔控制流&#xff1a;if let與let else高效編程指南&#x1f3af; if let&#xff1a;專注單一匹配場景&#x1f4a1; if let核心優勢&#xff1a;&#x1f504; if let與else搭配使用&#x1f680; let else&#xff1a;錯誤處理與提前返回&#x1f48e; let el…