LeetCode二分查詢總結

2021-06-22 18:10:10 字數 2491 閱讀 6346

對3道二分查詢題的總結,**於:soulmachine,code_ganker

search insert position

search in rotated sorted array

search in rotated sorted array ii

1.最基本的二分查詢:

思路就是每次取中間,如果等於目標即返回;否則根據大小關係切去一半。

因此演算法複雜度是o(logn),空間複雜度o(1)。

public class solution {  

public int searchinsert(int a, int target) {

int left=0;

int right=a.length-1;

while(left<=right){//【注意1】

int mid=(left+right)/2;

if(target==a[mid]) //find it!

return mid;

if (target

【注意1】while條件為left<=right,若找不到目標,最後一次操作是left和right指向同一index,執行一次迴圈體;結束時left>right,左右指標位置顛倒。  

【注意2】先寫lefthalf,再寫righthalf

【注意3】"以上實現有乙個好處:迴圈結束時,如果沒找到目標,那麼left一定停在恰好比目標大的index上,right一定停在恰好比目標小的index上,比較推薦這種實現。"  

2.旋轉陣列的查詢i:

基本二分查詢比較mid的值,這裡比較target是否在區間,別無特殊。

不用糾結於array怎麼無序的,關注於旋轉後一定有half是有序的。

public class solution {

public int search(int a, int target) {

int left=0;

int right=a.length-1;

while(left<=right){ //迴圈條件和基本二分查詢一樣

int mid=(left+right)/2;

if(a[mid]==target)

return mid;

if(a[left]<=a[mid]){ //lefthalf有序【注意1】

if(a[left]<=target && targeta[mid],lefthalf無序【注意3】

if(a[mid]

【注意1】條件必須是 a[left] <= a[mid],因為考慮到 left == mid 的case。例如:只寫"<",那麼考慮 a=[3,1], target=1 的測試用例,結果會是錯誤的"-1"。

【注意2】注意寫區間時候按照[,)來寫。判斷target是否在有序的half裡,思路較清楚。

至於為什麼區間含left(或right)不含mid,因為target可能在兩個邊緣,如果在mid,就會直接return。

【注意3】條件寫成 if ( a[left] > a[mid] ) -- else 也可以。

【注意4】關注於lefthalf是否有序,條件只能寫成" if ( a[left] <= a[mid] ) -- else ",原因如上。(soulmachine ver.)

關注於righthalf是否有序,條件可以寫成" if ( a[mid] < a[right] ) -- else ",或" if ( a[mid] < a[right] ) -- else ",oj均會accept。(code_ganker ver.)

3.旋轉陣列的查詢ii:

和上題一樣,只是因為元素重複,if(a[left]<=a[mid])不一定是有序的,需要將這個case拆解成兩部分處理:

-若 a[left] < a[mid] ,按照有序處理;

-若 a[left] ==a[mid],left++,處理邊緣再來查詢就ok。 

public class solution {

public boolean search(int a, int target) {

int left=0;

int right=a.length-1;

while(left<=right){

int mid=(left+right)/2;

if(a[mid]==target)

return true;

if(a[left]

【注意1】"對left移動一步,直到邊緣和中間不在相等或者相遇,這就導致了會有不能切去一半的可能。所以最壞情況(比如全部都是乙個元素,或者只有乙個元素不同於其他元素,而他就在最後乙個)就會出現每次移動一步,總共是n步,演算法的時間複雜度變成o(n)。"

leetcode演算法總結 二分查詢

查詢目標值及邊界 旋轉陣列 下面我總結乙個二分查詢通用模版,為二分查詢神器,使用該模版解決力扣上的二分查詢幾乎所有的問題。給定的有序陣列 我們要遍歷每個數。判斷遍歷的每個數是否符合給定的條件。比如判斷遍歷的每個數是否等於target 這時我們就要使用二分演算法。他的時間複雜度是o logn 要優於o...

LeetCode 查詢 二分查詢

給定乙個 n 個元素有序的 公升序 整型陣列 nums 和乙個目標值 target 寫乙個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 1。示例 輸入 nums 1,0,3,5,9,12 target 9 輸出 4 解釋 9 出現在 nums 中並且下標為 4 輸入 nu...

leetcode 二分查詢

leetcode 29 給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。演算法設計 用2進製的左移操作,每次對被除數左移1位,比較除數與被除數左移的後的大小關係,並在結果中加上左移...