二分查詢萬能3種模版

2021-10-01 06:39:13 字數 1460 閱讀 2083

我是結合大神的模板然後總結出自己的4個屢試不爽的模板吧。給速成的人吃快餐 死記硬背也能完全get解法

這是乙個萬能模板。

def binarysearch(nums:list, target:int) {

int left = 0, right = ...;

while(...) {

mid = (right + left) // 2;

if nums[mid] == target:

...else if nums[mid] < target) :

left = ...

else if nums[mid] > target):

right = ...

return ...

其中。。。是需要注意會出錯的地方了。

1.基本二分查詢,尋找乙個數

基本二分查詢乙個數的模板。

def binarysearch(nums:list, target:int) {

int left = 0, right = len(nums)-1;

while(left<=right) {

mid = (right + left) // 2;

if nums[mid] == target:

return mid

else if nums[mid] < target) :

left = mid+1

else if nums[mid] > target):

right = mid-1

return -1

2.尋找數的左側邊界,意思是返回3.尋找數的右側邊界,返回<=target的最大index。 

def binarysearch(nums:list, target:int) {

int left = 0, right = len(nums);

while(left4.尋找數的右側位,返回》target的最小index 

這個與3類似,區別就是最後返回的是left,為了防止target超過陣列最大元素導致left=size出現越界,所以在最開始先判斷target是否大於等於陣列中最大的元素,如果大於等於就直接return -1

def binarysearch(nums:list, target:int) {

int left = 0, right = len(nums);

if target>= nums[right-1]:

return -1

while(left總結:

基本二分查詢就不說了。

主要說後三種邊界定位 小於的最大index。小於等於的最大index 大於的最小index

首先三種的搜尋區間right都為len(nums),也就決定了迴圈判斷都是left三種判斷right的收緊都為mid left都為mid+1,對於第一種情況 mid第三種最後返回left 同時為了防止越界首先先加入判斷。

二分查詢模版

用於一般的二分查詢 public static intbinsearch2 int arr,int target if arr mid target else return 1 1 為啥是 lo mid 1,hi mid 1 而不是 lo mid,hi mid 呢?看迴圈條件 while lo hi...

二分查詢解題模版

常規 樸素的二分查詢 在一維陣列中查詢乙個數,有返回索引,無則返回 1 int binary search int arr,int n,int val else if arr mid val else return 1 變體1 可以總結為00001111問題,查詢滿足條件的第乙個1 int bina...

二分查詢模版 必背

注意點 跳出時都有lo 1 hi統一返回lo 1或hi lo 1 and hi nums.size 和 lo 0 and hi nums.size 1取中時一致 為什麼返回 lo 1 而不是 hi 退出迴圈時有 lo 1 hi 模板開始時將 lo,hi 看做是乙個開區間,通過不斷二分,最終這個區間中...