二分

二分法:

1.原理:

在升序數(shù)組 nums 中尋找目標(biāo)值nums[i],對于特定下標(biāo) i,比較nums[i] 和target 的大?。?/p>

? 如果 nums[i] = target ,則下標(biāo) i 即為要尋找的下標(biāo);

如果? nums[i] > target,則 target 只可能在下標(biāo) i 的左側(cè);

如果? nums[i] < target,則 target只可能在下標(biāo) i 的右側(cè)。

基于上述事實,可以在有序數(shù)組中使用二分查找尋找目標(biāo)值。

二分查找的做法是,定義查找的范圍[left,right],初始查找范圍是整個數(shù)組。每次取查找范圍的中點mid,比較 nums[mid] 和 target 的大小,如果相等則 mid 即為要尋找的下標(biāo),如果不相等則根據(jù) nums[mid] 和target 的大小關(guān)系將查找范圍縮小一半。

? 由于每次查找都會將查找范圍縮小一半,因此二分查找的時間復(fù)雜度是 O(logn),其中 n是數(shù)組的長度。

? ? ? 一般獲取數(shù)組中點的方法為:

intmid=left+(right-left)/2;

這樣做的好處是可以防止數(shù)據(jù)過大,超過int的界限。

2.代碼實現(xiàn):

? ? ? intleft=0;

intright=nums.length-1;

intmid=left+(right-left)/2;

while(left<=right){

if(nums[mid]==target){

returnmid;

}

if(nums[mid]>target){

right=mid-1;

intmid=left+(right-left)/2;

? ? ? ? ? ? ? //目標(biāo)值小于nums[mid],變化右邊界值,縮小范圍

}

if(nums[mid]<target){

left=mid+1;

intmid=left+(right-left)/2;

? ? ? ? ? ? ? ? ? //目標(biāo)值小于nums[mid],變化左邊界值,縮小范圍

}

}

return-1;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容