一般用法:
public
intbinarysearch
(int
nums,
int key)
else
if(nums[m]
> key)
else
}return-1
;}
二分法的時間複雜度為o(logn)變種
例如在乙個有重複元素的陣列中查詢 key 的最左位置的實現如下:
public
intbinarysearch
(int
nums,
int key)
else
}return nums[l]
== key ? l :-1
;}
注意:
l < h 而不是 l <= h,如果寫成 l <= h 會出現死迴圈。對 mid 的計算是偏左的,如 (3, 4)的 mid 是 3,右邊界不斷向左靠近,當 l 等於 右邊界 h 時,代表右邊界向左移動到極限。
leetcode 69. sqrt(x)
public
intmysqrt
(int x)
return h;
}
744. find smallest letter greater than target
大於給定元素的最小元素
public
char
nextgreatestletter
(char
letters,
char target)
return l == letters.length ? letters[0]
: letters[l]
;}
540. single element in a sorted array
有序陣列的 single element
第乙個版本:
public
intsinglenonduplicate
(int
nums)
else}}
else
else}}
return-1
;}
解題思路:求得 mid 與所有比較,若都不相同則返回nums[mid],否則根據mid的位置來判斷單個元素在左側還是右側。注意邊界值,當mid == 0 或 mid == length-1時直接返回nums[mid]。
我們來對上面**進行優化:
// 優化:利用陣列的特點:通過主動選擇mid,確保其為偶數,這樣其左側的元素個數就是偶數
public
intsinglenonduplicate2
(int
nums)
return nums[h]
;}
153. find minimum in rotated sorted array
旋轉陣列的最小數字
public
intfindmin
(int
nums)
return nums[h]
;}
34. find first and last position of element in sorted array
在排序陣列中查詢元素的第乙個和最後乙個位置
public
int[
]searchrange
(int
nums,
int target);if
(nums == null || nums.length ==0)
return res;
int l =
0, h = nums.length-1;
while
(l < h)
if(nums[h]
== target) res[0]
= h;
l = h;
h = nums.length-1;
while
(l < h)
if(nums[l]
== target) res[1]
= l;
return res;
}
二分法相關
浮點數的二分 例題 題目描述 告訴你圓台的高h,下地面半徑r,和上底面半徑r 你需要平行於地面切割圓台,使切割後的圓台上下兩部分相等,輸出切割平面的高度h 切割平面與 上 底面的距離 輸入第一行乙個t表示t組資料,每組資料三個整數h,r,r t 10 1 r,r,h 100 輸出如題所述輸出乙個浮點...
二分法相關
陣列有序 尋找目標數字x int maxn 110 int a maxn int binary int left,int right,int x return 1 最終沒有找到相等 尋找第乙個大於等於數字x的數字 int lower bound int a,int left,int right,in...
二分法相關
如何去使用二分搜尋去有序陣列大於等於某個數的最左側位置 二分如何考慮?用中點值和target比較 如果是大於等於target 如果是小於target public class bsleft public static int bsleft int array,int target else retu...