1. 排序陣列中找某個數(閉區間)1.傳統二分,在排序陣列中找某個數:[0,nums.length] 左右都閉區間2.允許重複的排序陣列裡找某個數的最左邊界(開區間)
3.在乙個允許重複的排序陣列裡找某個數的最右邊界(開區間)
4.旋轉陣列
5. 0~n-1中缺失的數字
int left = 0;
int right = nums.length - 1;
while(left <= right)
return -1;
2.在乙個允許重複的排序陣列裡找某個數的最左邊界。
eg. [1,2,3,3,3,3,4] 3的最左index=2。這個時候用開區間,遇到相等的右區間往左邊縮放。最後還需要判斷下 nums[left] == target,因為可能找不到。
int left = 0;
int right = nums.length; //開區間
while(left < right)
return left;
3.在乙個允許重複的排序陣列裡找某個數的最右邊界。
eg. [1,2,3,3,3,3,4] 3的最左index=5。這個時候用開區間,遇到相等的右區間往右邊縮放。最後中止條件會使得left=right,需要返回right-1或者left-1。此外最後還需要判斷下 nums[right] == target,因為可能找不到。
int left = 0;
int right = nums.length; //開區間
while(left < right)
return right-1;
4.leetcode33 搜尋旋轉排序陣列
旋轉陣列的問題分為兩種:帶重複的和不帶重複的。這一題是不帶重複的,都用閉區間。
判斷邏輯:看nums[left]<=nums[mid]是不是成立(必須有等號,因為當有偶數個時候,mid取兩個中間數的前乙個,區間長度為2的時候會造成left=mid)。
1.如果左邊是遞增的
- 如果在左邊遞增的範圍裡:選左邊 right = mid -1
- 如果非左邊遞增範圍:只能在右邊 left = mid + 1
2.如果左邊不是遞增的(只能右邊遞增)
- 如果在右邊的遞增範圍裡:選右邊 left = mid + 1
- 如果非右邊遞增範圍:只能左邊 right = left + 1
class solution
else
}return -1;
}}
5.leetcode81 搜尋旋轉排序陣列 ii
帶重複的旋轉陣列,思路與上一題一摸一樣,除了加一句相等時候的判斷。
class solution
else if (nums[left] == nums[mid])
else
}return false;
}}
5. 0~n-1中缺失的數字
輸入: [0,1,2,3,4,5,6,7,9]
輸出: 8
-----------------------------------
開區間,等於尋找最左的那個,和 帶重複的排序陣列找最左index一樣
class solution
return left;
}}
二分法細節
int binarysearch int nums,int target else if nums mid target else if nums mid target return 分析二分查詢的乙個技巧是 不要出現 else,而是把所有情況用 else if 寫清楚,這樣可以清楚地展現所有細節。...
二分法細節總結
二分法的思想很容易理解,但是細節處理卻是乙個難點。很容易就容易出錯。這裡總結一下這些細節。區間為 left,right 情況 右邊指標取不到元素 初始化 left 0 right arr.length 迴圈條件 left right 注意事項 left 的更新是取到值的情況 right的更新是不取到...
摸坑(二分法)
最近發現二分法做題時候經常出現錯誤,總是在細節方面做得不是很好,一直出錯,總是wrong answer。決定總結一下二分法。防止溢位 取中位數時候要防止在運算過程 現溢位情況。例如說 int的取值範圍為 2147483648 2147483647 占用4個位元組 2 31 2 31 1 你要在100...