二分查找萬能3種模版

 

 

嗯 在看了labuladong哥之前寫的一篇文章,結合最近遇到的4種題型,總結一下四種二分查找的模板吧。 鏈接地址:https://mp.weixin.qq.com/s/uA2suoVykENmCQcKFMOSuQ

我是結合大神的模板然後總結出自己的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.尋找數的左側邊界,意思是返回<target的最大index

def binarySearch(nums:list, target:int) {
    int left = 0, right = len(nums);

    while(left<right) {
        mid = (right + left)//2;
        if nums[mid] <target:
            left = mid+1
        else:
            right = mid
        return left

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

def binarySearch(nums:list, target:int) {
    int left = 0, right = len(nums);

    while(left<right) {
        mid = (right + left)//2;
        if nums[mid] <=target:
            left = mid+1
        else:
            right = mid
        return left-1

4.尋找數的右側位,返回>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<right) {
        mid = (right + left)//2;
        if nums[mid] <=target:
            left = mid+1
        else:
            right = mid
        return left-1

總結:

基本二分查找就不說了。

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

首先三種的搜索區間right都爲len(nums),也就決定了循環判斷都是left<right

三種判斷right的收緊都爲mid left都爲mid+1,對於第一種情況 mid<target是一種情況,對於第二第三種 mid<=target是一種情況

第三種最後返回left 同時爲了防止越界首先先加入判斷。

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章