查詢目標值及邊界
旋轉陣列
下面我總結乙個二分查詢通用模版,為二分查詢神器,使用該模版解決力扣上的二分查詢幾乎所有的問題。
給定的有序陣列 ,我們要遍歷每個數。
判斷遍歷的每個數是否符合給定的條件。(比如判斷遍歷的每個數是否等於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.最基本的二分查詢 思路就是每次取中間,如果等...