leetcode演算法總結 二分查詢

2021-10-13 04:03:54 字數 1743 閱讀 9570

查詢目標值及邊界

旋轉陣列

下面我總結乙個二分查詢通用模版,為二分查詢神器,使用該模版解決力扣上的二分查詢幾乎所有的問題。

給定的有序陣列 ,我們要遍歷每個數。

判斷遍歷的每個數是否符合給定的條件。(比如判斷遍歷的每個數是否等於target)

這時我們就要使用二分演算法。他的時間複雜度是o(logn) 要優於o(n)因為o(logn)效率幾乎和o(1)相等。具體可以看我的置頂部落格,時間複雜度比較圖

這是引出二分的原理模版,通過該模版我們可以清楚了解二分是如何執行的。

比如給定陣列 快速找到第乙個0 我們考慮使用二分

left也就是查詢不符合條件的第乙個值

//left 和 right 是我們取到到第乙個值和最後乙個值,左右都是閉的都可以取到的有效值

int left =1;

int right = n;

while

(left <= right)

else

}//重點:mid是符合if條件的最後乙個數,left = mid+1,迴圈完之後返回的是left為 不符合if條件 的第乙個index,從這裡就衍生出下面的模板了

return left;

典型例題一減,二等,三left在前

這樣得到的left下標就是不滿足if條件的第乙個數

//該模板適用於二分查詢:在遞增排序的陣列中查詢目標值target

//1.如果目標值不存在,則返回的left是target應該在的位置

//2.如果目標值存在且有重複if (nums[mid] < target),則返回target第乙個位置(左邊界)即不符合if條件的第乙個值,也就是target = nums[mid]的第乙個值

//3.如果目標值存在且有重複if (nums[mid] <= target),則返回大於target第乙個位置(右邊界)即不符合if條件的第乙個值,也就是target > nums[mid]的第乙個值

int left =0;

int right = nums.

size()

-1;//left 和 right 是我們取到到第乙個值和最後乙個值,左右都是閉的都可以取到的有效值

while

(left <= right)

else

}//mid是符合if條7件的最後乙個數,left = mid+1,

//則left返回的是不符合條件的第乙個位置

return left;

典型例題該類題型我們比較的是nums[right] < nums[mid]而不是和target比較

先判斷遞增區間,然後再根據區間,判斷target在哪邊。

典型例題

if

(target == nums[mid]

)return mid;

//下面我們判斷什麼情況下需要向右邊查詢,什麼情況下向左邊查詢

//1、如果右邊遞增,且target在右邊,則我們向右查詢。

//2、如果左邊遞增,且target在左邊,我們向左查詢。

//3. 如果右邊遞增,且target在左邊,我們向左查詢

//4. 如果左邊遞增,且target在右邊,我們向右查詢

else

if(nums[mid]

< nums[right]

)//如果右邊遞增

else

}else

else

}

參考資料:

二分演算法總結

討論分為3種,第一種是搜尋佇列中任意我們需求的結果,第三種我們需求佇列中有多個返回第乙個,第四種未我們搜尋佇列中有多個返回最後乙個元素的index。第一種 在一行排好序佇列a中搜尋target,一定有。int binarysearch int a,int n,int target return 1 ...

二分演算法總結

關於二分演算法想必大家也是耳熟能詳,但是在實施演算法時,往往在細節方面由於沒有考慮周全而抓耳撓腮,百思不得其解。這很正常。因為當年在學術界,第乙個正確的二分演算法寫出來就花了20年 又不正常。現在,對於二分演算法無論是理論研究還是實際運用都已經很純熟了,我們既然可以站在巨人的肩膀上,那又何樂而不為呢...

LeetCode二分查詢總結

對3道二分查詢題的總結,於 soulmachine,code ganker search insert position search in rotated sorted array search in rotated sorted array ii 1.最基本的二分查詢 思路就是每次取中間,如果等...