LeetCode 二分法細節,踩坑記錄

2021-10-05 01:49:37 字數 1928 閱讀 1149

1. 排序陣列中找某個數(閉區間)

2.允許重複的排序陣列裡找某個數的最左邊界(開區間)

3.在乙個允許重複的排序陣列裡找某個數的最右邊界(開區間)

4.旋轉陣列

5. 0~n-1中缺失的數字

1.傳統二分,在排序陣列中找某個數:[0,nums.length] 左右都閉區間

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...