思路很簡單,細節是魔鬼。
注意:搜尋區間,函式返回值的取值區間。
搜尋乙個數,如果存在,返回其索引,否則返回-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...