二分法的邏輯非常簡單,但是往往會因?yàn)檫吔鐔栴}而出錯(cuò)。這里可以先參考代碼隨想錄感受一下,不同的二分邊界對于循環(huán)判斷的區(qū)別。
1、leetcode 35 搜索插入位置?力扣
1)問題描述

2)分析錯(cuò)誤原因:
(1)沒有把情況考慮完整(尤其是特殊情況):當(dāng)numsSize == 1 時(shí)。
(2)代碼過于復(fù)雜,后面考慮到numsSize == 1的情形,但該部分程序獨(dú)立,沒有充分利用這部分信息服務(wù)后面計(jì)算機(jī)執(zhí)行過程。
3)改正

2、leetcode 278 第一個(gè)錯(cuò)誤版本?力扣
1)問題描述

2)錯(cuò)誤原因
(1)時(shí)間復(fù)雜度超出范圍;
(2)后來用二分法,但是對二分法不夠熟悉,不知道結(jié)束的結(jié)點(diǎn)。
3)改正

3、leetcode 34 在數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置?力扣
1)問題描述

2)難點(diǎn)
二分查找的結(jié)果如何確保是第一個(gè)/ 最后一個(gè)target?
3)思路:
分兩部分(以下兩個(gè)二分查找都是以r = numsSize - 1,l = 0為初值):
? ? (i)二分查找找第一個(gè)target;
? ? 套用模板a:

理由:當(dāng)nums[mid] >= target 時(shí),通過賦值 r = mid,就可以確定左邊界。當(dāng)nums[mid] < target時(shí),則可以令l = mid + 1,從而實(shí)現(xiàn)找第一個(gè)target。若循環(huán)結(jié)束,最后nums[r] != target,則說明數(shù)組中不存在等于target的元素,直接返回結(jié)果。
(ii)二分查找找最后一個(gè)target;

當(dāng)nums[mid] > target時(shí),往左半?yún)^(qū)域賦找,r = mid - 1;當(dāng)nums[mid] <= target時(shí),往右半?yún)^(qū)域查找,l = mid,直到找到最后一個(gè)<=target的元素,返回其位置。
tips:
(1)為防止mid計(jì)算過程溢出,可以用表達(dá)式.
(2)為什么模版2中mid和模版1的mid不一樣?

4)代碼實(shí)現(xiàn)

4、leetcode 69 x的平方根?力扣
1)問題描述

2)錯(cuò)誤原因分析

另外,在撰寫代碼過程中,由于不熟練,知道求<= x情形,即套用模版b,但是在賦值的時(shí)候搞不清楚mid賦值給誰。理解好,<=x的意義是找“最后一個(gè)滿足<=x的元素“,故區(qū)間應(yīng)該是從左往右收縮,從而l = mid;
3)改正
