對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。
【注意1】"對left移動一步,直到邊緣和中間不在相等或者相遇,這就導致了會有不能切去一半的可能。所以最壞情況(比如全部都是乙個元素,或者只有乙個元素不同於其他元素,而他就在最後乙個)就會出現每次移動一步,總共是n步,演算法的時間複雜度變成o(n)。"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]
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位,比較除數與被除數左移的後的大小關係,並在結果中加上左移...