Leetcode二分搜索法淺析

文章目錄

    • 1.二分搜索法
      • 1.1什么是二分搜索法?
      • 1.2解法思路

1.二分搜索法

題目原文:

給定一個 n 個元素有序的(升序)整型數組 nums 和一個目標值 target ,寫一個函數搜索 nums 中的 target,如果目標值存在返回下標,否則返回 -1

示例 1:

輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現在 nums 中并且下標為 4

示例 2:

輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1

1.1什么是二分搜索法?

我們來看AI給出的回答:

二分搜索法,又稱折半查找算法,是一種在有序列表(如數組)中高效查找特定元素的搜索算法。該算法利用了列表元素已排序的特性,通過反復將待搜索區間分成兩半來縮小查找范圍,具體步驟如下:

  1. 初始化: 確定搜索區間,通常開始時是整個列表,設兩個指針分別指向列表的起始位置(low)和結束位置(high)。

  2. 計算中間位置: 計算當前搜索區間的中間索引 mid = (low + high) / 2,并獲取該位置的元素值。

  3. 比較與決策:

    • 如果中間元素正好是要查找的目標,則搜索結束,返回該元素的位置。
    • 如果目標值小于中間元素,則在左半區間(low 到 mid-1)繼續搜索,更新 high = mid - 1。
    • 如果目標值大于中間元素,則在右半區間(mid+1 到 high)繼續搜索,更新 low = mid + 1。
  4. 重復步驟2和3,直到找到目標值或搜索區間為空(即 low > high),此時表明目標值不在列表中。

二分搜索法的時間復雜度為 O(log n),其中 n 是列表中元素的數量。這意味著對于大規模數據集合,二分搜索遠比順序搜索(時間復雜度為 O(n))高效。然而,為了應用二分搜索,列表必須事先排序,且通常適用于靜態數據或不頻繁插入刪除操作的數據結構。

可以看出二分搜索法顧名思義就是不斷來縮小我們的搜索區間,來查找特定元素的一種高效算法,而在使用二分搜索法時,關鍵的地方就在于如何確定我們的區間邊界。

1.2解法思路

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size()-1;while(left <= right){int madile = left+(right - left) / 2;if(nums[madile] > target){right = madile - 1;}if(nums[madile] < target){left = madile + 1;}if(nums[madile] == target){return madile;}}return -1;}
};

開始我們可以給定一個左閉右閉的區間,是左區間left = 0,右區間right = nums.size -1,此時判斷邊界時就需要考慮:左區間和右區間的關系時小于等于還是小于?

開始我們的思路時給定一個左閉右閉的區間,也就是說左區間的值可以等于右區間,所以在第一個邊界判斷時,我們的左區間是可以等于右區間的。

當我們對目標值進行判斷后,我們的左右區間又該如何判斷呢?

第一種情況:當我們所要查找的目標值小于區間中值時,我們需要考慮的是,此時的右區間right是等于madile還是等于madile-1,回到判斷條件中nums[madile] > target,這表示我們區間的中值已經大于我們的目標值了,所以我們下一次的判斷時,已經不需要考慮madile,所以此時的右區間應該是madile-1

同樣的道理當區間中值小于目標值時,我們要更新左區間的值,此時左區間的值為madile+1
在這里插入圖片描述

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

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

相關文章

從PyTorch官方的一篇教程說開去(1 - 初心)

原文在此&#xff0c;喜歡讀原汁原味的可以自行去跟&#xff0c;這是一個非常經典和有學習意義的例子&#xff0c;在此向老爺子們致敬 - https://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html 開源文化好是好&#xff0c;但是“公地的悲哀”這點避不開…

每天一個數據分析題(四百三十七)- 統計量

若x1、x2、x3取自某總體的樣本&#xff0c;當期望a已知&#xff0c;方差c未知時&#xff0c;則以下不是統計量的是 A. x1x2x3 B. min{x1&#xff0c;x2&#xff0c;x3} C. a(x1x2)/2 D. (x1x2x3)/c 數據分析認證考試介紹&#xff1a;點擊進入 題目來源于CDA模擬題庫 點擊…

用c語言實現一個alexnet

在C語言中實現一個完整的AlexNet神經網絡是一個復雜的任務,涉及大量的矩陣運算和卷積操作。這個示例代碼將涵蓋AlexNet的主要組件,包括卷積層、ReLU激活函數、池化層和全連接層。 由于C語言本身沒有像Python的NumPy那樣的矩陣庫,我們需要自己編寫矩陣運算函數。另外,C語言…

高效運維:構建全面監控與自動化管理體系

在當今的數字化時代&#xff0c;運維管理已成為企業IT架構中不可或缺的一環。它不僅關乎系統的穩定運行&#xff0c;更直接影響到業務的響應速度、故障處理時間以及客戶滿意度等多個方面。因此&#xff0c;構建一套全面監控與自動化管理體系&#xff0c;對于提升企業運維效率、…

無人機之多旋翼與固定翼的區別

多旋翼無人機和固定翼無人機是無人機技術中的兩種主要形式&#xff0c;各自有獨特的優勢和應用場景。 一、飛行原理與結構 多旋翼無人機&#xff1a;依靠多個旋翼產生升力來平衡飛行器的重力&#xff0c;通過改變每個旋翼的轉速控制飛行器的姿態和平穩&#xff0c;使其能夠垂…

C++ //練習 15.22 對于你在上一題中選擇的類,為其添加合適的虛函數及公有成員和受保護的成員。

C Primer&#xff08;第5版&#xff09; 練習 15.22 練習 15.22 對于你在上一題中選擇的類&#xff0c;為其添加合適的虛函數及公有成員和受保護的成員。 環境&#xff1a;Linux Ubuntu&#xff08;云服務器&#xff09; 工具&#xff1a;vim 代碼塊 class Shape {public:S…

PDF文件無法編輯?3步快速移除PDF編輯限制

正常來說,我們通過編輯器打開pdf文件后,就可以進行編輯了&#xff61;如果遇到了打開pdf卻不能編輯的情況,那有可能是因為密碼或是掃描件的原因&#xff61;小編整理了一些pdf文件無法編輯&#xff0c;以及pdf文件無法編輯時我們要如何處理的方法&#xff61;下面就隨小編一起來…

[word] word如何編寫公式? #微信#知識分享

word如何編寫公式&#xff1f; word如何編寫公式&#xff1f;Word中數學公式是經常會使用到的&#xff0c;若是要在文檔中錄入一些復雜的公式&#xff0c;要怎么做呢&#xff1f;接下來小編就來給大家講一講具體操作&#xff0c;一起看過來吧&#xff01; 方法一&#xff1a;…

stm32學習:(寄存器3)系統架構

時鐘系統 時鐘樹 在STM32中有3種不同的時鐘源用來驅動系統時鐘(SYSCLK)&#xff1a; HSI振蕩器時鐘&#xff08;High Speed Internal oscillator&#xff0c;高速內部時鐘&#xff09;HSE振蕩器時鐘&#xff08;High Speed External&#xff08;Oscillator / Clock&#xff…

Ruby爬蟲技術:深度解析Zhihu網頁結構

在互聯網時代&#xff0c;數據的價值日益凸顯&#xff0c;尤其是在社交媒體和問答平臺如Zhihu&#xff08;知乎&#xff09;上&#xff0c;用戶生成的內容蘊含著豐富的信息和洞察。本文將深入探討如何使用Ruby爬蟲技術來解析Zhihu的網頁結構&#xff0c;并獲取有價值的數據。 …

linux service小例

linux service 測試 1.創建一個app // myapp.c // 間隔10s寫入時間到文件 #include <stdio.h> #include <time.h> #include <unistd.h> // 引入unix標準函數定義&#xff0c;如sleep()int main() {FILE *fp;time_t now;char buffer[80];// 打開文件以追加模…

啊?原來你也看環法賽!—VELO Angel Glide坐墊,與你共攀環法榮耀之路!

當七月的熱浪席卷賽道&#xff0c;環法自行車賽&#xff08;Tour de France&#xff09;的戰鼓再次響起&#xff0c;挑戰與夢想交織的火花在每一寸賽道上綻放。自1903年首屆賽事以來&#xff0c;環法已成為全球最具聲望的自行車賽事&#xff0c;吸引著無數頂尖騎手和觀眾的目光…

c語言程序環境和預處理

test.c(源文件) --> 編譯器 --> test.obj(目標文件,在debug里) 鏈接庫和多個目標文件 經過 鏈接器的處理&#xff0c;最終生成可執行程序.exe 編譯階段 預處理/預編譯階段 &#xff1a;1.頭文件的包含 2.define定義符號的替換&#xff0c;并刪除定義的符號 3.刪除注釋 這…

醫學影像歸檔與通訊系統源碼,C#PACS源碼,涵蓋放射、超聲、內鏡、病理、核醫學

醫學影像歸檔與通訊系統&#xff08;PACS&#xff09;系統&#xff0c;是一套適用于從單一影像設備到放射科室、到全院級別等各種應用規模的醫學影像歸檔與通訊系統。PACS集患者登記、圖像采集、存檔與調閱、報告與打印、查詢、統計、刻錄等功能為一體&#xff0c;有效地實現了…

【保衛花果山】游戲

游戲介紹 拯救花果山是一款玩家能夠進行趣味闖關的休閑類游戲。拯救花果山中玩家需要保護花果山的猴子&#xff0c;利用各種道具來防御妖魔鬼怪的入侵&#xff0c;游戲中玩家需要面對的場景非常的多樣&#xff0c;要找到各種應對敵人的方法。拯救花果山里玩家可以不斷的進行闖…

【開源 Mac 工具推薦之 2】洛雪音樂(lx-music-desktop):免費良心的音樂平臺

舊版文章&#xff1a;【macOS免費軟件推薦】第6期&#xff1a;洛雪音樂 Note&#xff1a;本文在舊版文章的基礎上&#xff0c;新更新展示了一些洛雪音樂的新功能&#xff0c;并且描述更為詳細。 簡介 洛雪音樂&#xff08;GitHub 名&#xff1a;lx-music-desktop &#xff09;…

JavaScript學習筆記(九)

56、JavaScript 類 56.1 JavaScript 類的語法 請使用關鍵字 class 創建一個類。 請始終添加一個名為 constructor() 的方法。 JavaScript 類不是對象。 它是 JavaScript 對象的模板。 語法&#xff1a; class ClassName {constructor() { ... } }示例&#xff1a;例子創…

C#實現數據采集系統-ModbusTCP查詢報文分析和實現、通信實現、測試項目

ModbusTcp的應用 Modbus是工業通信協議中廣泛使用的協議,大部分設備都支持。Modbus TCP是一種基于TCP/IP網絡的工業通信協議,它是Modbus協議的一種變種,專門設計用于在網絡上傳輸數據。 Modbus TCP/IP保留了Modbus串行協議的數據結構和功能特性,同時利用了TCP/IP網絡的高…

什么是 std::ios::sync_with_stdio(false)

介紹 std::ios::sync_with_stdio(false) 是 C 中的一個配置設置&#xff0c;用于控制標準 I/O 流&#xff08;如 std::cin, std::cout&#xff09;的行為。這個設置主要用于優化輸入輸出操作的性能&#xff0c;尤其是在處理大量數據時。 在 C 中&#xff0c;標準流庫&#xf…

stm32:CAN通訊

目錄 介紹 協議層 CAN的 幀/報文 種類 數據幀 遠程幀&#xff08;遙控幀&#xff09; 錯誤幀 過載幀 幀間隔 總線仲裁 stm32的CAN外設 工作模式 測試模式 功能框圖 時序 標準時序 例子 環回靜默模式測試 寄存器代碼 HAL版本 介紹 一種功能豐富的車用總線標…