【LeetCode 熱題 100】35. 搜索插入位置——二分查找(左閉右開)

Problem: 35. 搜索插入位置
給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。
請必須使用時間復雜度為 O(log n) 的算法。

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(log N)
    • 空間復雜度:O(1)

整體思路

這段代碼旨在解決一個經典的搜索問題:搜索插入位置 (Search Insert Position)。問題要求在一個已排序的數組 nums 中查找目標值 target。如果找到,則返回其索引;如果未找到,則返回它應該被插入的位置的索引,以保持數組的有序性。

該算法采用的核心方法是二分查找(Binary Search),這是一種在有序數據集中進行高效查找的算法。此特定實現方式是一種常見的“左閉右開”區間模板,其目標是找到第一個大于或等于 target 的元素的位置。

算法的整體思路可以分解為以下步驟:

  1. 定義搜索區間

    • 算法使用兩個指針 leftright 來定義一個左閉右開的搜索區間 [left, right)
    • left 初始化為 0,right 初始化為數組的長度 nums.length。這意味著初始搜索范圍覆蓋了整個數組的所有合法索引以及末尾的插入位置。
  2. 循環搜索

    • 算法的主體是一個 while (left < right) 循環。這個條件意味著只要搜索區間 [left, right) 還不是空的(即至少包含一個元素),搜索就繼續。當 left == right 時,區間為空,循環終止。
    • 在循環內部,計算中間位置 mid
    • 比較與分區:將中間位置的元素 nums[mid]target進行比較,以縮小搜索范圍:
      • Case 1: nums[mid] < target: 如果中間值小于目標值,說明 target 必定在 mid 的右側。因此,我們可以安全地排除掉 mid 及其左側的所有元素。通過 left = mid + 1,將搜索區間更新為 [mid + 1, right)
      • Case 2: nums[mid] >= target: 如果中間值大于或等于目標值,說明 target 可能就是 nums[mid],或者在 mid 的左側。在這種情況下,mid 本身就是一個潛在的答案(可能是第一個大于等于target的位置)。我們不能排除 mid,因此通過 right = mid,將搜索區間更新為 [left, mid)
  3. 確定最終結果

    • 循環最終會因為 leftright 相遇而終止。此時,left (或 right) 指向的位置就是“插入點”。
    • 這個位置的含義是:它是數組中第一個大于或等于 target 的元素的索引。
    • 如果 target 存在于數組中,這個位置就是 target 首次出現的索引。
    • 如果 target 不存在,這個位置就是 target 應該被插入以保持數組有序的索引。
    • 因此,直接返回 left 即可。

完整代碼

class Solution {/*** 在一個已排序的數組中查找目標值,如果找到則返回其索引,* 否則返回它應該被插入的位置的索引。* @param nums 一個已升序排序的整數數組* @param target 目標整數* @return 目標值的索引或插入位置的索引*/public int searchInsert(int[] nums, int target) {// left: 搜索區間的左邊界,初始為 0。int left = 0;// right: 搜索區間的右邊界,初始為數組長度。// 定義了一個左閉右開的搜索區間 [left, right)。int right = nums.length;// 當左邊界小于右邊界時,搜索空間不為空,循環繼續。// 循環終止條件是 left == right。while (left < right) {// 計算中間索引。>> 1 是除以2的位運算,效率高且能防止(left+right)整數溢出。int mid = (left + right) >> 1;// 如果中間值小于目標值if (nums[mid] < target) {// 說明目標值必定在右半部分 [mid + 1, right) 中。// 更新左邊界,排除 mid 及左邊的所有元素。left = mid + 1;} else {// 如果中間值大于或等于目標值// 說明目標值在左半部分 [left, mid] 中,或者 mid 本身就是目標。// 更新右邊界,將 mid 包含在新的搜索區間 [left, mid) 內作為可能的答案。right = mid;}}// 循環結束時,left 和 right 相遇。// 該位置就是插入點,它指向數組中第一個大于或等于 target 的元素。// 這既是 target 的插入位置,也是當 target 存在時其首次出現的索引。return left;}
}

時空復雜度

時間復雜度:O(log N)

  1. 算法核心:該算法是二分查找。
  2. 計算依據
    • while 循環的每一次迭代中,搜索區間 [left, right) 的大小(即 right - left)都會被大約減半。
    • 假設初始的搜索區間大小為 N。經過 k 次迭代后,區間大小變為 N / 2^k
    • 循環在區間大小縮減到 1 或 0 時終止,即 N / 2^k ≈ 1
    • 解這個方程得到 2^k ≈ N,所以 k ≈ log?(N)
    • 由于循環的迭代次數與 N 的對數成正比,因此時間復雜度為 O(log N)

空間復雜度:O(1)

  1. 主要存儲開銷:算法在執行過程中,只使用了少數幾個整型變量來存儲狀態,如 left, right, mid
  2. 計算依據
    • 這些變量的數量是固定的,不隨輸入數組 nums 的大小 N 的變化而改變。
    • 算法沒有創建任何新的、與輸入規模成比例的數據結構(如新數組或哈希表)。

綜合分析
算法所需的額外輔助空間是常數級別的。因此,其空間復雜度為 O(1)

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

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

相關文章

Python-初學openCV——圖像預處理(四)——濾波器

目錄 一、圖像噪點消除噪聲&#xff1a; 1、概念 2、均值濾波 3、方框濾波 4 、高斯濾波 5、中值濾波 6、雙邊濾波 7、總結 一、圖像噪點消除噪聲&#xff1a; 1、概念 指圖像中的一些干擾因素&#xff0c;通常是由圖像采集設備、傳輸信道等因素造成的&#xff0c;表現…

嵌入式系統可靠性設計

嵌入式系統可靠性設計硬件件可靠性設計1. 硬件設計原則2. 硬件設計注意問題2.1 引腳布局和走線2.2 元器件選擇和布局2.3 電源和地線分離2.4 EMI/EMC設計2.5 系統可靠性2.6 資源利用和擴展性軟件可靠性設計1. 設計原則1.1 模塊化設計1.2 冗余設計1.3 容錯設計1.4 實時性保障1.5 …

cJSON在STM32單片機上使用遇到解析數據失敗問題

我們在單片機上解析JSON格式時&#xff08;比如在用云平臺物聯網開發時&#xff09;&#xff0c;可以直接使用cJson庫來完成自己的操作&#xff0c;而不需要單獨實現&#xff0c;具體使用方法可以搜一下。 cJson&#xff1a;一個基于 C 語言的 Json 庫&#xff0c;它是一個開源…

python3基礎語法梳理(三)

接上一篇博客 &#x1f3ae; 猜數字小游戲 - Python版 &#x1f9e0; 游戲規則&#xff1a; 系統隨機生成一個 1 到 10 的整數玩家輸入猜測的數字使用 if 語句判斷玩家猜得是否正確提示“猜對了”或“太大/太小了” import randomsecret_number random.randint(1, 10) att…

【docker】將已有mysql腳本導入鏡像內使用

準備SQL腳本將SQL腳本&#xff08;如init.sql&#xff09;放在宿主機目錄下&#xff0c;例如&#xff1a;/path/to/sql-scripts/init.sql啟動MySQL容器并掛載腳本使用 -v 參數將SQL腳本掛載到容器的初始化目錄&#xff1a;docker run --name mysql-container \-e MYSQL_ROOT_PA…

【機器學習深度學習】LLamaFactory微調效果與vllm部署效果不一致如何解決

目錄 前言 一、問題本質 1.1 問題說明 1.2 問題本質示意 二、常見原因 LLaMAFactory對話模板規則定義 模型對話模板定義規則 三、解決方法 提取代碼myset.py 創建jinja文件 安裝VLLM 運行VLLM 安裝運行open webui流程 四、流程梳理 前言 本文主要講述的主要內容…

Python入門構建網頁

用純 Python 構建 Web 應用 本教程將帶你從零開始&#xff0c;構建一個交互式的待辦事項清單。 fasthtml 的核心哲學是“回歸初心&#xff0c;大道至簡”。在當今復雜的前后端分離技術棧中 &#xff0c;它提供了一條返璞歸真的路徑&#xff0c;旨在讓你能用純粹的 Python 構建從…

開源 Arkts 鴻蒙應用 開發(九)通訊--tcp客戶端

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

Go的defer和recover

在 Go 語言中&#xff0c;defer 和 recover 是兩個緊密相關的關鍵字&#xff0c;主要用于錯誤處理和資源清理。它們通常一起使用&#xff0c;特別是在處理panic&#xff08;運行時崩潰&#xff09;時&#xff0c;確保程序不會直接崩潰&#xff0c;而是能夠優雅地恢復并繼續執行…

Spring Boot 配置文件常用配置屬性詳解(application.properties / application.yml)

前言 Spring Boot 的一大優勢就是通過簡單的配置文件即可快速定制應用行為&#xff0c;而無需編寫大量 XML 配置或 Java 代碼。Spring Boot 使用 application.properties 或 application.yml 作為核心配置文件&#xff0c;支持豐富的配置屬性。 本文將詳細介紹 Spring Boot 常用…

uni-appDay02

1.首頁-通用輪播組件 輪播圖組件需要再首頁和分類頁使用&#xff0c;封裝成通用組件 準備組件自動導入組件 <script setup lang"ts"> import XtxSwiper from /components/XtxSwiper.vue import CustomNavbar from ./components/CustomNavbar.vue </scrip…

FastAPI入門:請求體、查詢參數和字符串校驗、路徑參數和數值校驗

請求體 FastAPI 使用請求體從客戶端&#xff08;例如瀏覽器&#xff09;向 API 發送數據。請求體是客戶端發送給 API 的數據。響應體是 API 發送給客戶端的數據。 使用 Pydantic 模型聲明請求體&#xff0c;能充分利用它的功能和優點 from fastapi import FastAPI from pydanti…

Docker的docker-compose類比Spring的ApplicationContext

總一句話是&#xff1a;Docker Compose&#xff1a;集中化管理多個容器及其依賴的資源環境&#xff1b;ApplicationContext&#xff1a;集中化管理 多個Bean 及其運行所需的資源和依賴關系。 1. 整體概念 Docker Compose&#xff1a;用于定義和運行多容器 Docker 應用程序&…

Reason-before-Retrieve(CVPR 2025)

研究方向&#xff1a;Image Captioning論文全名&#xff1a;《Reason-before-Retrieve: One-Stage Reflective Chain-of-Thoughts for Training-Free Zero-Shot Composed Image Retrieval》1. 論文介紹組合圖像檢索&#xff08;CIR&#xff09;旨在檢索與參考圖像密切相似的目標…

Idefics2:構建視覺-語言模型時,什么是重要的

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" Idefics2&#xff1a;構建視覺-語言模型時&#xff0c;什么是重要的 摘要 隨著large language models和vision transformers的進步&#xff0c;視覺-語言模型&#xff08;VLMs&#xff09;受到了越來越多的關注…

再談fpga開發(fpga調試方法)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】我們之前在學校學習c、c的時候&#xff0c;其實學校漏掉了很重要的一個教學環節&#xff0c;那就是調試、測試。很多時候我們代碼寫出來了&#xff…

C語言中的數據結構--棧和隊列(1)

前言本屆開始我們將對數據結構中棧的內容進行講解,那么廢話不多說,我們正式進入今天的學習棧棧是一種很特殊的線性表&#xff0c;它只能在固定的一端進行插入和刪除操作&#xff0c;進行數據的插入和刪除的一端叫做棧頂&#xff0c;另外一端叫做棧底&#xff0c;棧中的元素遵守…

字符串是數據結構還是數據類型?

比較糾結的一個問題&#xff0c;以下是在網上查到后總結的&#xff0c;不知道對不對&#xff0c;歡迎討論。這是個觸及計算機科學核心概念的精妙問題&#xff01;字符串既可以被視為一種數據類型&#xff0c;也可以被視為一種數據結構&#xff0c;這取決于你觀察的視角和討論的…

Cline與Cursor深度實戰指南:AI編程助手的革命性應用

引言 在AI編程工具快速發展的今天&#xff0c;Cline和Cursor作為兩款備受矚目的AI編程助手&#xff0c;正在重新定義開發者的工作方式。作為一名深度使用這兩款工具的開發者&#xff0c;我在過去一年的實踐中積累了豐富的經驗和獨到的見解。本文將從技術角度深入分析Cline和Cur…

根本是什么

根本是什么 根本沒有了&#xff0c;枝葉還在么&#xff1f; 沒有了內涵&#xff0c;外延還有么&#xff1f; 丟棄了根本&#xff0c;再嗨也是無意義&#xff0c;無根據空虛之樂罷了。 人之所行所言所思所想所念皆欲念、歷程感懷&#xff0c;情思。所謂得失過往&#xff0c;時空…