二分查詢的三種模板

2021-10-05 19:29:22 字數 1466 閱讀 2299

思路很簡單,細節是魔鬼。

注意:搜尋區間,函式返回值的取值區間。

搜尋乙個數,如果存在,返回其索引,否則返回-1。

int

binarysearch

(int

nums,

int target)

return-1

;}

搜尋區間是閉區間 [left, right]

迴圈終止條件是:搜素區間為空。

因為搜素區間是閉區間,所以迴圈終止條件是 left > right,否則 [left,left]區間不為空。

向右收縮搜尋區間時,mid已經比較過了,因為搜尋區間是閉區間,所以需要+1。

向左收縮搜尋區間時,mid已經比較過了,因為搜尋區間是閉區間,所以需要-1。

int

left_bound

(int

nums,

int target)

else

if(nums[mid]

< target)

else

if(nums[mid]

> target)}if

(left != nums.length && nums[left]

== target)

return-1

;}

搜尋區間是左閉右開區間 [left, right)

迴圈終止條件是:搜素區間為空。

因為搜素區間是左閉右開區間,所以迴圈終止條件是 left = right 。

向左收縮搜尋區間時,mid已經比較過了,因為搜尋區間是左閉右開區間,所以將mid的值賦給right。

函式的返回值(即 left 變數的值)取值區間是閉區間 [0, nums.length],所以我們簡單新增兩行**就能在正確的時候 return -1

與尋找左邊界基本相同

int

right_bound

(int

nums,

int target)

else

if(nums[mid]

< target)

else

if(nums[mid]

> target)}if

(left !=

0&& nums[left-1]

== target)

return-1

;

搜尋區間是左閉右開區間 [left, right)

迴圈終止條件是:搜素區間為空。

因為搜素區間是左閉右開區間,所以迴圈終止條件是 left = right 。

向右收縮搜尋區間時,mid已經比較過了,因為搜尋區間是左閉右開區間,所以+1。

left 取值區間是閉區間 [0, nums.length],返回值是left -1,所以我們簡單新增兩行**就能在正確的時候 return -1

詳細講解參考:詳解二分查詢演算法

二分查詢 三種模板(C 版本)

int binarysearch vector nums,int target else if nums mid target else end condition left right return 1 模板 1 是二分查詢的最基礎和最基本的形式。這是乙個標準的二分查詢模板,大多數高中或大學會在他...

二分查詢 三種場景

也稱 折半查詢 binary search 使用前提 線性表採用順序儲存結構,表中元素按關鍵字有序排列 二分查詢是一種基於比較目標值和陣列中間元素的教科書式演算法。實現 維護兩個指標left,right,指標之間是搜尋區間 時間複雜度 o logn 空間複雜度 o 1 public int sear...

二分查詢的三種實現

int lower bound int a,int x,int y,int v return x 儘管查詢區間是左閉右開期間 x,y 返回值的候選區卻是閉區間 x,y 當v不存在時,返回的是第乙個比v大的值下標。int upper bound int a,int x,int y,int v retu...