二分法細節總結

2021-10-05 03:05:28 字數 2139 閱讀 8008

二分法的思想很容易理解,但是細節處理卻是乙個難點。很容易就容易出錯。這裡總結一下這些細節。區間為 [left, right)情況(右邊指標取不到元素):

* 初始化: left = 0;right = arr.length;

* 迴圈條件:left < right

* 注意事項:

* left 的更新是取到值的情況

* right的更新是不取到值的情況

區間為 [left, right]情況(左右指標都可以取到元素):
* 初始化: left = 0;right = arr.length - 1;

* 迴圈條件:left <= right

* 注意事項:

* left 的更新是取到值的情況

* right的更新是也是取到值的情況

二分查詢元素法:
package binarysearch;

public

class

searchvalue

;for

(int num : arr )

}/**

* 二分查詢,是否存在num,存在返回下標,不存在返回-1

* @param arr

* @param num

* @return

*/public

static

intsearchindex1

(int

arr,

int num)

else

if(arr[mid]

< num)

}return-1

;}public

static

intsearchindex2

(int

arr,

int num)

else

if(arr[mid]

< num)

}return-1

;}}

尋找左側的邊界:
package binarysearch;

public

class

searchthelefttarget

;for

(int num : arr )

}/**

* 找出小於val值的個數,即 **第乙個大於或等於val值的下標**

* @param arr

* @param val

* @return

*/public

static

intsearchcount

(int

arr,

int val)

else

if( arr[mid]

< val)

}//迴圈跳出條件是left == right,最終返回哪個都行

return left;

}}

尋找右側的邊界:
package binarysearch;

public

class

searchtherighttarget

;for

(int num : arr )

}/**

* 找出 第乙個小於或等於val值的下標

* @param arr

* @param val

* @return

*/public

static

intsearchcount

(int

arr,

int val)

else

if(arr[mid]

> val)

}return left -1;

}}

分析⼆分查詢**時,不要出現 else,全部展開成 else if ⽅便理解。

注意「搜尋區間」和 while 的終⽌條件,如果存在漏掉的元素,記得在最後檢查。

如需要搜尋左右邊界,只要在 nums[mid] == target 時做修改即可,搜尋右側時需要減⼀。若target在nums陣列中不存在,我們可以假設target存在,則搜尋左邊時,return的是假設的target位置右邊的值,即稍微比target大一點的值,若搜尋的是右邊時,return的事假設的target位置左邊的值,即稍微比target小一點的值。

二分法細節

int binarysearch int nums,int target else if nums mid target else if nums mid target return 分析二分查詢的乙個技巧是 不要出現 else,而是把所有情況用 else if 寫清楚,這樣可以清楚地展現所有細節。...

二分法 總結

1 二分查詢 binarysearch 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用向量作為表的儲存結構。不妨設有序表是遞增有序的。2 二分查詢的基本思想 二分查詢的基本思想是 設r low,high 是當前的查詢區間 1 首先確定...

二分法小總結

主要分為兩種 區間按序列劃分和區間按值劃分 區間按序列劃分 這種比較常見,一般是針對有序陣列或者部分有序陣列 如旋轉有序陣列 m是序列的中點,不斷的縮小區間。33 81 153 154 69 162 4 74 區間按值劃分 主要是無序陣列會使用,m取可能結果的最小值和最大值的中值,所以就是不停的猜m...