你真的了解二分查詢嗎?

2021-09-29 15:39:28 字數 1587 閱讀 9887

基本框架:

int binarysearch(int nums, int target)  else if (nums[mid] < target)  else if (nums[mid] > target) 

}return ...;

}

這個場景是最簡單的,肯能也是大家最熟悉的,即搜尋乙個數,如果存在,返回其索引,否則返回 -1。

int binarysearch(int nums, int target) 

return -1;

}

採用<=的原因:

因為右邊界取的是nums.length-1,如果是《則取不到最後乙個邊界,在執行left=mid+1時有可能越界,mid在leftwhile(left < right) 的終止條件是 left == right,在上一次迴圈中可能修改了其中乙個值,導致這個值沒有辦法訪問

上面這種方法是找到乙個滿足的就終止return,不一定是第乙個

為什麼 left = mid + 1,right = mid - 1?我看有的**是 right = mid 或者 left = mid:

因為 mid 已經搜尋過,應該從搜尋區間中去除。

此演算法有什麼缺陷?

無法定位元素第乙個或者最後乙個。你也許會說,找到乙個 target,然後向左或向右線性搜尋不行嗎?可以,但是不好,因為這樣難以保證二分查詢對數級的複雜度了。

int searchrange(int nums, int target) else if(nums[mid]也可以寫成:

int searchrange(int nums, int target)

}else

}}

相比找到乙個數,這種形式我們不能在找到乙個數後停止,還需繼續縮小區間到左邊,直到找到最左邊的那個元素

也就是下面這段,當相等時,不直接return,而是儲存當前值後縮小right區間到mid-1

else if(nums[mid]==target)
int searchrange(int nums, int target) else if(nums[mid]也可以寫成:

int searchrange(int nums, int target)

}else

}}

相比找到乙個數,這種形式我們不能在找到乙個數後停止,還需繼續縮小區間到右邊,直到找到最右邊的那個元素

也就是下面這段,當相等時,不直接return,而是儲存當前值後縮小left區間到mid+1

else if(nums[mid]==target)
恰當使用,在不同需求下使用不同的二分查詢

參考:

本篇文章由一文多發平台artipub自動發布

你真的會二分查詢嗎?

看到這個標題無論你是處於怎樣的心理進來看了,我覺得都是值得的。因為這個問題太簡單,任何乙個開始接觸 真正 演算法基本都是從二分查詢開始的。至於二分查詢都不知道是什麼的可以先去找別的資料看下,再來看這篇文章。既然很簡單,那麼我們開始一起寫乙個吧,要求是對num 不減序列在區間 0,7 進行查詢,當然我...

你真的會二分查詢嗎?

引用請註明出處 看到這個標題無論你是處於怎樣的心理進來看了,我覺得都是值得的。因為這個問題太簡單,任何乙個開始接觸 真正 演算法基本都是從二分查詢開始的。至於二分查詢都不知道是什麼的可以先去找別的資料看下,再來看這篇文章。既然很簡單,那麼我們開始一起寫乙個吧,要求是對num 不減序列在區間 0,7 ...

你真的會二分查詢嗎?

看到這個標題無論你是處於怎樣的心理進來看了,我覺得都是值得的。因為這個問題太簡單,任何乙個開始接觸 真正 演算法基本都是從二分查詢開始的。至於二分查詢都不知道是什麼的可以先去找別的資料看下,再來看這篇文章。既然很簡單,那麼我們開始一起寫乙個吧,要求是對num 不減序列在區間 0,7 進行查詢,當然我...