二分查找法

使用二分查找法的前提:(1)數組為有序數組.

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)數組中無重復元素.

二分的兩種寫法:

方法一:[left,right]

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

方法二:[left,rigght)

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

核心代碼(遞歸)

int binsearch(int left,int right)

????????{

? ? ? ? ? ? ? ? if(left<=right)

????????????????????????{

? ? ? ? ????????? ? ????????int mid=(left+right)/2;

? ? ? ? ? ? ????????????????if(nums[mid]==target)

? ? ? ? ? ? ? ? ? ? ? ? ? ? return mid;

? ? ? ? ? ? ????????????????if(nums[mid]>target)

? ? ? ? ? ? ? ? ? ? ? ? ? ? return binsearch(left,mid-1);

? ? ? ? ? ? ????????????????if(nums[mid]<target)

? ? ? ? ? ? ? ? ? ? ? ? ? ??return binsearch(mid+1,right);

????????????????????????}

? ? ? ? ? ? ????????return 0;

? ? ? ? }

核心代碼(循環)

int f=-1;

while(left<=right)

{

? ? ? ? int mid=(left+right)/2;

????????if(nums[mid]==target)

????????{

????????????????f=mid;

????????????????break;

????????}

????????if(target<nums[mid])

????????right=mid-1;

????????if(target>nums[mid])

????????left=mid+1

}

? ? ? ? if(f==-1)

????????cout<<"沒找到";

? ? ? ? ?else

???????? cout<<f<<endl;

以下是力扣二分法題目的常見解題思路:
?

704. 二分查找
?
- 初始化左右指針?left?和?right?,分別指向數組兩端。
- 在?left <= right?的循環中,計算中間索引?mid?。
- 比較?nums[mid]?與?target?,若相等則返回?mid?;若?nums[mid] > target?,則更新?right = mid - 1?;若?nums[mid] < target?,則更新?left = mid + 1?。
- 循環結束未找到則返回-1。
?
35. 搜索插入位置
?
- 同樣以?left?和?right?初始化數組兩端。
- 循環條件為?left <= right?,計算?mid?后,若?nums[mid] >= target?,則?right = mid - 1?,否則?left = mid + 1?。
- 循環結束后,?left?所指位置就是目標值應插入的位置。
?
34. 在排序數組中查找元素的第一個和最后一個位置
?
- 先通過二分法找目標值第一個位置,當?nums[mid] >= target?時,更新?right = mid?,循環結束后?left?可能是第一個位置,需再判斷?nums[left]?是否為?target?。
- 找最后一個位置時,當?nums[mid] <= target?時,更新?left = mid?,循環結束后,若?nums[right]?是?target?,?right?就是最后一個位置。
?
69. x的平方根
?
- 令?left = 0?,?right = x?,在?left <= right?循環中計算?mid?。
- 若?mid * mid <= x && (mid + 1) * (mid + 1) > x?,則?mid?就是所求平方根;若?mid * mid > x?,更新?right = mid - 1?;否則更新?left = mid + 1?。
?
367. 有效的完全平方數
?
- 類似求平方根,?left?設為1,?right?設為?num?。
- 循環中計算?mid?,若?mid * mid == num?,則返回?true?;若?mid * mid > num?,更新?right = mid - 1?,否則更新?left = mid + 1?。循環結束未找到則返回?false?。
?
162. 尋找峰值
?
- 初始化?left = 0?,?right = nums.length - 1?。
- 當?left < right?時,計算?mid?,若?nums[mid] > nums[mid + 1]?,說明峰值在左半部分,更新?right = mid?;否則峰值在右半部分,更新?left = mid + 1?。
- 循環結束后,?left?指向的就是一個峰值位置。

判斷?right?應賦值為?mid?還是?mid - 1?

關鍵在于二分查找的目標以及當前中間值與目標值的關系,具體可從以下幾方面判斷:
?
- 查找精確值且數組元素唯一:當目標是在有序數組中查找某個精確值,且數組元素唯一時,若?nums[mid] > target?,說明目標值在左半部分,此時應將?right?賦值為?mid - 1?。因為?nums[mid]?已經大于?target?,它不可能是目標值,所以下一輪查找范圍應不包含?mid?,如704. 二分查找就是這種情況。
?
- 查找左邊界或最大不超過目標值的元素:若要查找目標值在數組中的左邊界,或者是查找數組中最大的、不超過目標值的元素時,當?nums[mid] >= target?,應將?right?賦值為?mid?。這是為了讓查找范圍繼續向左側收縮,且保留?mid?位置,因為?mid?位置有可能就是左邊界,或者是符合條件的最大元素,如35. 搜索插入位置、34. 查找元素第一個位置就需這樣處理。
?
- 查找右邊界或最小超過目標值的元素:當任務是查找目標值的右邊界,或者是要找到數組中最小的、超過目標值的元素時,若?nums[mid] <= target?,則應將?right?賦值為?mid - 1?。這樣能使查找范圍向右收縮,同時排除?mid?位置,因為?mid?位置及左側元素已不滿足“右邊界”或“最小超過目標值”的條件,例如34. 查找元素最后一個位置時就遵循此規則。

二分法是一種通過不斷將區間一分為二,逐步逼近目標值的算法方法,適用于以下幾類題型:


-方程求解類:用于求解方程f(x)=0的根。若函數f(x)在區間[a,b]上連續,且f(a)\cdot f(b)<0,則可利用二分法在該區間內尋找方程的根。如求解方程x^3 - 2x - 1 = 0在區間[1,2]內的根。
?
- 函數最值類:當函數f(x)在某區間上具有單調性,且已知最值所在的大致區間時,可通過二分法來逼近最值。例如,求函數f(x)=x^2 - 4x + 3在區間[0,3]上的最小值,可利用二分法不斷縮小包含最小值的區間。
?
- 數據查找類:常用于在有序數組中查找特定元素。如在一個按升序排列的整數數組?[1, 3, 5, 7, 9, 11]?中查找數字7,可使用二分法,每次將數組分成兩部分,確定目標元素在左半部分還是右半部分,逐步縮小查找范圍。
?
- 參數確定類:一些問題中需要確定某個參數的取值,使得某個條件成立。若該條件與參數之間存在單調關系,可借助二分法確定參數值。比如,在物理實驗中,要確定一個電阻值,使得電路中的電流滿足某個范圍,已知電流與電阻成反比例關系,就可通過二分法來嘗試不同電阻值,找到符合條件的電阻。
?
- 最優解搜索類:在一些組合優化問題中,若目標函數具有單調性或滿足一定的條件,可利用二分法搜索最優解。如背包問題中,已知背包容量和物品重量價值,二分查找能裝入背包的最大價值對應的重量限制,進而求解最優裝包方案。

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

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

相關文章

HarmonyOS:頁面滾動時標題懸浮、背景漸變

一、需求場景 進入到app首頁或者分頁列表首頁時&#xff0c;隨著頁面滾動&#xff0c;分類tab要求固定懸浮在頂部。進入到app首頁、者分頁列表首頁、商品詳情頁時&#xff0c;頁面滾動時&#xff0c;頂部導航欄&#xff08;菜單、標題&#xff09;背景漸變。 二、相關技術知識點…

鯤鵬+昇騰部署集群管理軟件GPUStack,兩臺服務器搭建雙節點集群【實戰詳細踩坑篇】

前期說明 配置&#xff1a;2臺鯤鵬32C2 2Atlas300I duo&#xff0c;之前看網上文檔&#xff0c;目前GPUstack只支持910B芯片&#xff0c;想嘗試一下能不能310P也部署試試&#xff0c;畢竟華為的集群軟件要收費。 系統&#xff1a;openEuler22.03-LTS 驅動&#xff1a;24.1.rc…

React中 點擊事件寫法 的注意(this、箭頭函數)

目錄 ?1、錯誤寫法?&#xff1a;onClick{this.acceptAlls()} ?2、正確寫法?&#xff1a;onClick{this.acceptAlls}&#xff08;不帶括號&#xff09; 總結 方案1&#xff1a;構造函數綁定 方案2&#xff1a;箭頭函數包裝方法&#xff08;更簡潔&#xff09; 方案3&am…

【路由交換方向IE認證】BGP選路原則之Weight屬性

文章目錄 一、路由器BGP路由的處理過程控制平面和轉發平面選路工具 二、BGP的選路順序選路的前提選路順序 三、Wight屬性選路原則規則9與規則11的潛移默化使用Weight值進行選路直接更改Weight值進行選路配合使用route-map進行選路 四、BGP鄰居建立配置 一、路由器BGP路由的處理…

Missashe考研日記-day20

Missashe考研日記-day20 1 高數 學習時間&#xff1a;2h30min學習內容&#xff1a; 今天當然是刷題啦&#xff0c;做不等式的證明板塊的真題&#xff0c;證明題懂的都懂&#xff0c;難起來是真的一點思路都沒有&#xff0c;這個板塊還沒做完&#xff0c;做完再總結題型。 2…

了解JVM

一.JVM概述 1.JVM的作用 ?把字節碼編譯為機器碼去執行,負責把字節碼裝載到虛擬機中 ?現在的 JVM 不僅可以執行 java 字節碼文件,還可以執行其他語言編譯后的字節碼文件,是一個跨語言平臺 2.JVM的組成部分 類加載器&#xff08;ClassLoader&#xff09;運行時數據區&#x…

LeetCode LCR157 套餐內商品的排列順序

生成字符串的全部排列&#xff08;去重&#xff09;&#xff1a;從問題到解決方案的完整解析 問題背景 在編程和算法設計中&#xff0c;生成字符串的所有排列是一個經典問題。它不僅出現在算法競賽中&#xff0c;也在實際開發中有著廣泛的應用&#xff0c;比如生成所有可能的…

pgsql:關聯查詢union(并集)、except(差集)、intersect(交集)

pgsql:關聯查詢union(并集)、except(差集)、intersect(交集)_pgsql except-CSDN博客

微信小程序中使用ECharts 并且動態設置數據

項目下載地址 GitHub 地址 https://github.com/ecomfe/echarts-for-weixin 將當前文件夾里的內容拷貝到項目中 目錄&#xff1a; json: {"usingComponents": {"ec-canvas": "../components/ec-canvas/ec-canvas"} }wxml&#xff1a; <ec…

RV1126 人臉識別門禁系統解決方案

1. 方案簡介 本方案為類人臉門禁機的產品級解決方案,已為用戶構建一個帶調度框架的UI應用工程;準備好我司的easyeai-api鏈接調用;準備好UI的開發環境。具備低模塊耦合度的特點。其目的在于方便用戶快速拓展自定義的業務功能模塊,以及快速更換UI皮膚。 2. 快速上手 2.1 開…

深度學習ResNet模型提取影響特征

大家好&#xff0c;我是帶我去滑雪&#xff01; 影像組學作為近年來醫學影像分析領域的重要研究方向&#xff0c;致力于通過從醫學圖像中高通量提取大量定量特征&#xff0c;以輔助疾病診斷、分型、預后評估及治療反應預測。這些影像特征涵蓋了形狀、紋理、灰度統計及波形變換等…

DeepSeek 接入 Word 完整教程

一、前期準備 1.1 注冊并獲取 API 密鑰 訪問 DeepSeek 平臺&#xff1a; 打開瀏覽器&#xff0c;訪問 DeepSeek 官方網站&#xff08;或您使用的相應平臺&#xff09;。注冊并登錄您的賬戶。 創建 API 密鑰&#xff1a; 在用戶控制面板中&#xff0c;找到“API Keys”或“API…

驅動開發硬核特訓 · Day 7:深入掌握 Linux 驅動資源管理機制(Resource Management)

&#x1f50d; B站相應的視屏教程&#xff1a; &#x1f4cc; 內核&#xff1a;博文視頻 - 總線驅動模型實戰全解析 —— 以 PCA9450 PMIC 為例 敬請關注&#xff0c;記得標為原始粉絲。 &#x1f6a9; 在 Linux 驅動開發中&#xff0c;資源管理機制決定了驅動的穩定性與可靠性…

什么是TensorFlow?

TensorFlow 是由 Google Brain 團隊開發的開源機器學習框架&#xff0c;被廣泛應用于深度學習和人工智能領域。它的基本概念包括&#xff1a; 1. 張量&#xff08;Tensor&#xff09;&#xff1a;在 TensorFlow 中&#xff0c;數據以張量的形式進行處理。張量是多維數組的泛化…

【ChCore Lab 01】Bomb Lab 拆炸彈實驗(ARM匯編逆向工程)

文章目錄 1. 前言2. 實驗代碼版本問題3. 關于使用問題4. 宏觀分析5. read_line 函數介紹6. phase_0 函數6.1. read_int 函數6.2. 回到 phase_0 函數繼續分析6.3. 驗證結果 7. phase_1 函數7.2. 驗證結果 8. phase_2 函數8.1. read_8_numbers 函數8.2. 回到 phase_2 函數繼續分析…

《Vue Router實戰教程》20.路由懶加載

歡迎觀看《Vue Router 實戰&#xff08;第4版&#xff09;》視頻課程 路由懶加載 當打包構建應用時&#xff0c;JavaScript 包會變得非常大&#xff0c;影響頁面加載。如果我們能把不同路由對應的組件分割成不同的代碼塊&#xff0c;然后當路由被訪問的時候才加載對應組件&am…

docker 多主機容器組網

一、服務器A 1、初始化Swarm集群&#xff08;管理節點&#xff09; docker swarm init --advertise-addr 主節點ip 2、獲取工作節點??加入Swarm集群所需的Token 和完整命令 docker swarm join-token worker 3、創建Overlay網絡 docker network create -d overlay --subnet…

rancher 解決拉取dashboard-shell鏡像失敗的問題

問題背景 在 Kubernetes 集群中部署 Rancher 后&#xff0c;點擊右上角的 "Shell" 按鈕時&#xff0c;Rancher 會動態創建一個 dashboard-shell-xxxxx Pod&#xff0c;用于提供 Web 終端功能。然而&#xff0c;由于默認鏡像 rancher/shell:v0.1.21 托管在 Docker Hu…

OpenCV day2

Matplotlib相關知識 Matplotlib相關操作&#xff1a; import numpy as np from matplotlib import pyplot as pltx np.linspace(0, 2 * np.pi, 100) y1 np.sin(x) y2 np.cos(x)# 使用紅色虛線&#xff0c;圓點標記&#xff0c;線寬1.5&#xff0c;標記大小為6繪制sin plt.p…

【網絡安全】通過 JS 尋找接口實現權限突破

未經許可,不得轉載。 本文所述所有風險點均已修復。 文章目錄 引言正文引言 以下些漏洞已被起亞方面修復;起亞方面確認,這些漏洞從未被惡意利用過。 2024年6月11日,我們發現起亞汽車存在一系列嚴重安全漏洞,攻擊者僅憑車牌號即可遠程控制車輛的核心功能。該攻擊不需要接觸…