基本框架:
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;
}
採用<=的原因:上面這種方法是找到乙個滿足的就終止return,不一定是第乙個因為右邊界取的是nums.length-1,如果是《則取不到最後乙個邊界,在執行left=mid+1時有可能越界,mid在leftwhile(left < right) 的終止條件是 left == right,在上一次迴圈中可能修改了其中乙個值,導致這個值沒有辦法訪問
為什麼 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 進行查詢,當然我...