嗯 在看了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 同時爲了防止越界首先先加入判斷。