本內(nèi)容是筆者結(jié)合《代碼隨想錄》總結(jié)所得,記錄學(xué)習(xí)過(guò)程,分享知識(shí)!
目錄:
1. 開(kāi)篇例題:704. 二分查找
2. 題解參考(模板寫法)- - 2.1 方法一:左閉右閉寫法
- - 2.2 方法二:左閉右開(kāi)寫法3. 模板解釋:左閉右閉
- - 3.1 區(qū)間劃定
- - 3.2 left 、right 移動(dòng)問(wèn)題
- - 3.3 循環(huán)條件選擇:<=4. 模板解釋:左閉右開(kāi)
- - 4.1 區(qū)間劃定
- - 4.2 left 、right 移動(dòng)問(wèn)題
- - 4.3 循環(huán)條件選擇:<
5. 相關(guān)題集
1. 開(kāi)篇例題:704. 二分查找
例題:點(diǎn)擊直飛
2. 題解參考
2.1 方法一:左閉右閉寫法
class Solution {
public:
int search(vector<int>& nums, int target) {
// 左閉右閉:left:指向首元素,right:指向尾元素;
int left = 0, right = nums.size()-1;
// 注意循環(huán)條件:<=
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] > target ) right = mid - 1;
else if(nums[mid] < target) left = mid + 1;
else return mid;
}
return -1;
}
};
2.2 方法二:左閉右開(kāi)寫法
class Solution {
public:
int search(vector<int>& nums, int target) {
// 左閉右開(kāi):left:指向首元素,right:指向尾元素下一個(gè)位置;
int left = 0, right = nums.size();
// 注意循環(huán)條件:<
while(left < right){
int mid = left + (right - left) / 2;
if(nums[mid] > target ) right = mid;
else if(nums[mid] < target) left = mid + 1;
else return mid;
}
return -1;
}
};
3. 模板解釋:左閉右閉
3.1 區(qū)間劃定
左閉右閉:即說(shuō)的是:left 與 right 的初始值【 兩個(gè)“指針的指向” 】
左閉右閉:left:指向首元素,right:指向尾元素;(如下圖)
3.2 left 、right 移動(dòng)問(wèn)題
由于是:左閉右閉區(qū)間情形,那么 left 和 right 一定指向順序表中的某個(gè)值!
顯然:
- right 的移動(dòng):若:nums[mid] > target,則說(shuō)明 target 不在 [mid,right] 區(qū)間范圍內(nèi),此時(shí)移動(dòng) right,移動(dòng)方式:right = mid -1;
- left 的移動(dòng):若:nums[mid] < target,則說(shuō)明 target 不在 [left,mid] 區(qū)間范圍內(nèi),此時(shí)移動(dòng) left ,移動(dòng)方式:left = mid +1;
3.3 循環(huán)條件選擇:<=
顯然,如果:順序表中只有一個(gè)元素:left == right【由區(qū)間選擇所得】
若 選擇: < (非 <= )則:不會(huì)進(jìn)入循環(huán)!
無(wú)法得到:mid 進(jìn)行搜索判斷!
直接返回結(jié)果:-1(未找到?。?/p>
4. 模板解釋:左閉右開(kāi)
4.1 區(qū)間劃定
左閉右開(kāi):即說(shuō)的是:left 與 right 的初始值【 兩個(gè)“指針的指向” 】
左閉右開(kāi):left:指向首元素,right:指向尾元素下一個(gè)位置;(如下圖)
4.2 left 、right 移動(dòng)問(wèn)題
由于是:左閉右開(kāi)區(qū)間情形,那么 left 一定指向順序表中的某個(gè)值!但 right 不會(huì)指向任意一個(gè)值!
顯然:
- right 的移動(dòng):若:nums[mid] > target,則說(shuō)明 target 不在 [mid,right) 區(qū)間范圍內(nèi),此時(shí)移動(dòng) right,移動(dòng)方式:right = mid;
難點(diǎn):mid 在比較過(guò)程中,理解右端點(diǎn)移動(dòng),mid 指向的若不是目標(biāo)值,則區(qū)間縮減時(shí),mid 已經(jīng)不存在新區(qū)間中了?。。?/li>- left 的移動(dòng):若:nums[mid] < target,則說(shuō)明 target 不在 [left,mid] 區(qū)間范圍內(nèi),此時(shí)移動(dòng) left ,移動(dòng)方式:left = mid +1;
4.2 循環(huán)條件選擇:<
顯然,非空順序表中一定存在:left != right【由區(qū)間選擇所得】
即至少會(huì)進(jìn)入一個(gè)循環(huán):即只有一個(gè)元素的情形!
同時(shí):由于 left 若滿足合法指向,就一定滿足:left < right,不存在 =
因此:選擇:<文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-444337.html
5. 相關(guān)題集
待選中文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-444337.html
到了這里,關(guān)于算法刷題營(yíng)【Day1】:: 704.二分查找:二分法詳談與相關(guān)刷題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!