二分法相關題目

2021-09-16 20:17:48 字數 2192 閱讀 7580

一般用法:

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