二分查找理論及例題

二分查找(Binary Search)是一種常用的搜索算法,用于在有序數組中快速查找目標值。以下是二分查找的詳細理論知識、優缺點以及適用場景:

  1. 理論知識:

    • 基本原理:二分查找通過比較目標值與數組的中間元素,將查找范圍縮小一半,直到找到目標值或查找范圍為空。
    • 前提條件:二分查找要求數組必須是有序的,可以是升序或降序。
    • 過程步驟:
      • 初始化左右指針,分別指向數組的第一個和最后一個元素;
      • 計算中間元素的索引;
      • 比較目標值與中間元素的大小,根據比較結果調整左右指針;
      • 重復上述過程直到找到目標值或查找范圍為空。
  2. 優點:

    • 效率高:二分查找的時間復雜度為O(log n),相較于線性查找的O(n),性能更好。
    • 算法簡單:二分查找的實現邏輯清晰,易于理解和實現。
    • 適用于有序數組:只有在有序數組中才能應用二分查找,如果數組無序,則需要先進行排序。
  3. 缺點:

    • 僅適用于有序數組:二分查找要求目標數組是有序的,如果數組無序,則無法應用二分查找。
    • 需要額外空間:二分查找通常需要額外的指針來指示查找范圍,使得空間復雜度較高。
    • 數據更新困難:如果目標數組需要頻繁更新,如插入、刪除等操作,需要重復進行排序,降低效率。
  4. 適用場景:

    • 針對有序數組:二分查找適用于對有序數組進行快速查找,可以有效地減少查找時間。
    • 大規模數據查找:對于大規模數據集合,二分查找能夠迅速縮小查找范圍,提高查找效率。
    • 需要高效查找的場景:在對數據要求較高且需要快速查找的場景中,二分查找是一個好的選擇。

以上是關于二分查找的詳細理論知識、優缺點以及適用場景。希望對你有幫助!

接下來來到簡簡單單的小例題:

704. 二分查找

給定一個?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
// 在有序數組中搜索目標值并返回其索引
public int search(int[] nums, int target) {int l = 0; // 左邊界int r = nums.length; // 右邊界,注意這里是數組長度,不是最后一個元素的索引while (l <= r) { // 當左邊界小于等于右邊界時執行循環int mid = (l + r) / 2; // 計算中間位置if (target == nums[mid]) { // 如果目標值等于中間值,返回中間索引return mid;}if (target < nums[mid]) { // 如果目標值小于中間值,縮小右邊界r = mid - 1;}if (target > nums[mid]) { // 如果目標值大于中間值,增大左邊界l = mid + 1;}}return -1; // 未找到目標值,返回-1
}

?

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

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

相關文章

Qt(五)網絡編程

文章目錄 一、QTcpServer類&#xff08;一&#xff09;使用&#xff08;二&#xff09;示例1. 服務端2. 客戶端&#xff1a; 二、 一、QTcpServer類 QTcpServer類用于監聽客戶端的連接&#xff0c;每當有一個客戶端連接到服務端&#xff0c;都會生成一個新的QTcpSocket對象與客…

【每日一練】python面對對象的基本概念和用法(附實例)

面向對象編程&#xff08;OOP&#xff09;是一種程序設計方法&#xff0c;其基本概念包括對象、類、繼承和封裝。 對象&#xff1a;對象是系統中的基本單位&#xff0c;用于描述客觀事物。每個對象包含一組屬性和對這些屬性進行操作的方法。對象是類的一個實例&#xff0c;具有…

Spark SQL----NULL語義

Spark SQL----NULL語義 一、比較運算符中的空處理二、邏輯運算符中的空處理三、表達式中的空處理3.1 null-intolerant表達式中的空處理3.2 可以處理空值操作數的空處理表達式3.3 內置聚合表達式中的空處理 四、WHERE、HAVING和JOIN子句中的條件表達式的空處理五、在GROUP BY和D…

Camera Raw:直方圖

Camera Raw 的直方圖 Histogram面板不僅提供了照片亮度和色彩分布信息&#xff0c;還具備多項實用功能&#xff0c;輔助評估和調整照片。 ◆ ◆ ◆ 直方圖的構成 直方圖是一個二維坐標系統&#xff0c;橫坐標表示不同程度的像素亮度&#xff0c;從左到右通常對應的是 0 ~ 255…

升級springboot3.2集成shiro的問題

由于之前的springcloud相關版本太久&#xff0c;很多新功能無法使用&#xff0c;所以打算抽時間把代碼的版本做一下升級。使用最新版的springboot3.2&#xff0c;發現shiro過濾器無效。經檢查發現原因&#xff1a; springboot3.x使用的是JDK17&#xff0c;從jdk8以后javax.serv…

視頻智能解析:Transformer模型在視頻理解的突破性應用

視頻智能解析&#xff1a;Transformer模型在視頻理解的突破性應用 隨著人工智能技術的飛速發展&#xff0c;視頻理解已成為計算機視覺領域的一個熱點問題。Transformer模型&#xff0c;以其在處理序列數據方面的強大能力&#xff0c;已經被廣泛應用于視頻理解任務中。本文將深…

Github 2024-07-11 Go開源項目日報 Top10

根據Github Trendings的統計,今日(2024-07-11統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Go項目10Solidity項目1Python項目1frp: 一個開源的快速反向代理 創建周期:2946 天開發語言:Go協議類型:Apache License 2.0Star數量:75872 …

Spring的bean的生命周期——bean的創建與銷毀

1、生成類信息map 掃描包&#xff0c;用asm技術獲取類信息&#xff0c;打了ComponentScancomponentservice等注解的類會放入map。key是類名&#xff0c;value是beanDefinition類的基本信息 2、加載類 context.getBean("userService") 從類信息map中獲取beanDefin…

SSRF漏洞深入利用與防御方案繞過技巧

文章目錄 前言SSRF基礎利用1.1 http://內網資源訪問1.2 file:///讀取內網文件1.3 dict://探測內網端口 SSRF進階利用2.1 Gopher協議Post請求2.2 Gopher協議文件上傳2.3 GopherRedis->RCE2.4 JavaWeb中的適用性&#xff1f; SSRF防御繞過3.1 Url黑名單檢測的繞過3.2 Url白名單…

對controller層進行深入學習

目錄 1. controller層是干什么的&#xff1f;1.1 controller原理圖1.2 controller層為什么要存在&#xff1f;1.2.1 分離關注點1.2.2 響應HTTP請求1.2.3 數據處理與轉換1.2.4 錯誤處理與狀態管理1.2.5 流程控制1.2.6 依賴注入與測試 1.3 controller層的優點1.3.1 多端支持1.3.2…

Gin框架自定義路由

Gin框架是一個用Go語言&#xff08;Golang&#xff09;編寫的Web框架&#xff0c;它提供了靈活且高效的路由系統。在Gin框架中&#xff0c;自定義路由是一個基礎且重要的操作&#xff0c;它允許開發者定義應用程序如何處理不同的HTTP請求。以下是自定義路由的詳細步驟和方法&am…

Linux虛擬化大師:使用 KVM 和 QEMU 進行高級虛擬化管理

Linux 虛擬化大師&#xff1a;使用 KVM 和 QEMU 進行高級虛擬化管理 虛擬化技術是現代數據中心的核心技術之一&#xff0c;它可以將一臺物理服務器分割成多個虛擬機&#xff0c;從而提高資源利用率&#xff0c;降低成本&#xff0c;并增強系統的靈活性和可擴展性。KVM&#xf…

C++ | Leetcode C++題解之第225題用隊列實現棧

題目&#xff1a; 題解&#xff1a; class MyStack { public:queue<int> q;/** Initialize your data structure here. */MyStack() {}/** Push element x onto stack. */void push(int x) {int n q.size();q.push(x);for (int i 0; i < n; i) {q.push(q.front());…

C++ 【 Open3D 】 點云按高程進行賦色

一、 Open3D中根據點云的高程度信息為點云中的每個點附上顏色&#xff0c;并保存顏色渲染結果&#xff01; #include<iostream> #include<open3d/Open3D.h>using namespace std;int main() {//-------------------------------讀取點云--------------------------…

nasa數據集——1 度網格單元的全球月度土壤濕度統計數據

AMSR-E/Aqua level 3 global monthly Surface Soil Moisture Averages V005 (AMSRE_AVRMO) at GES DISC GES DISC 的 AMSR-E/Aqua 第 3 級全球地表土壤水分月平均值 V005 (AMSRE_AVRMO) AMSR-E/Aqua level 3 global monthly Surface Soil Moisture Standard Deviation V005 (…

優化 .NET Core 應用程序的安全性和性能以應對高負載

一. .NET Core 中的安全措施 1. 身份驗證和授權 實施強大的身份驗證和授權機制是保護應用程序資源的基礎。.NET Core 內置支持各種身份驗證方案&#xff0c;例如 JWT&#xff08;JSON Web 令牌&#xff09;、OAuth 和 OpenID Connect。通過配置身份驗證中間件并定義授權策略&…

vue中el-table單元格復制功能

一、單頁面中使用 1.在el-table上綁定單擊事件 cell-click“copyText” 或雙擊事件 cell-dblclick“copyText” 注&#xff1a;cell-dblclick函數有四個參數&#xff0c;分別是row, column, cell, event&#xff1b; row&#xff1a;可看到被其操作單元格所在行的所有的數據&…

【IT領域新生必看】解鎖 `final` 關鍵字的秘密:Java 編程中的終極武器

文章目錄 引言什么是 final 關鍵字&#xff1f;一、 final 變量final 局部變量final 實例變量final 靜態變量 二、 final 方法三、 final 類四、 final 關鍵字的實際應用1. 定義常量2. 防止方法被重寫3. 創建不可變類4. 優化性能 五、 final 的一些常見誤區1. final 變量不能在…

力扣995.K連續位的最小翻轉次數

力扣995.K連續位的最小翻轉次數 因為翻轉順序改變不影響最終結果 因此從頭找每個位置翻轉后的結果如果為0 將從它開始的K長的數組翻轉 class Solution {public:int minKBitFlips(vector<int>& nums, int k) {int n nums.size();vector<int> s(n1);int res0…

05.FFMPEG日志系統

一、頭文件 #include <libavutil/log.h> 二、常用函數 1、av_log_set_level void av_log_set_level(int level);該函數用于設置全局日志級別。 2、av_log void av_log(void* avcl, int level, const char* fmt, ...);該函數用于輸出日志消息。avcl 參數是相關聯的上下…