九章演算法01 二分法

2021-10-07 23:14:45 字數 3732 閱讀 8101

public

class

solution

int start =

0, end = nums.length -1;

while

(start +

1< end)

else

if(nums[mid]

< target)

else}if

(nums[start]

== target)

if(nums[end]

== target)

return-1;}}

上面模板,有四點需要注意:

while迴圈的條件是start + 1 < end,這樣寫是為了避免死迴圈: 迴圈體內startend永不相鄰,導致mid不至於跟startend之一重合,造成bug.

考慮到乙個情況:start == end+1,此時若要求推出條件為start == end,則根據後面的**,永遠不可能退出.

取中點的操作mid = start + (end - start) / 2,這個是為了防止大數相加溢位.

==,>,<三種情況分開來寫,不要合併.因為寫完之前,沒人知道這三種情況是否會有些許的不同.

另外在<>兩種情況下,適當放寬條件,將下個區間起始位置指定在不可能是答案的end上,在不降低時間複雜度的同時減少了bug發生的可能.

在迴圈中不進行任何返回,迴圈的作用是縮小區間,將答案限制在我們可以數的過來的兩個值上.

另外根據我們要找的具體條件,這個模板還要在兩個地方進行改寫.

上面一種模板是對應於後文ooxx情況的,也就是沒有明確分界點的情況,如果有準確的分界點target的話,也可以用while (start <= end)且在while迴圈中直接return,但這樣的話就需要把子區間轉移的條件寫的準確一些,防止死迴圈(start=end+1,end=mid-1).

public

class

solution

int start =

0, end = nums.length -1;

while

(start +

1< end)

else

if(nums[mid]

< target)

else

}return-1;}}

題目:

704. binary search

34. find first and last position of element in sorted array

所謂ooxx的造型,就是把所有小於target的項標記為o,大於等於target的項標記為x,然後去找第乙個x即可.

題目:278. first bad version: 將good version視為o,將bad version視為x.

153. find minimum in rotated sorted array:

對於旋轉有序陣列nums,兩個threshold分別為nums[0]nums[-1],應該取哪乙個作為區分ox的threshold呢?

應該取nums[-1]作為threshold: 將nums[i]>nums[-1]視為o;將nums[i]<=nums[-1]視為x.(若取nums[0]作為threshold的話,就無法滿足單調遞增陣列的情況,單調遞增陣列也是旋轉有序陣列).

對於154. find minimum in rotated sorted array ii這道題,有乙個特點在於原陣列中的資料不是嚴格遞增(相鄰的可能會相等).這種非嚴格性在一般情況下不會產生問題,但是在旋轉陣列的兩側會產生問題:當nums[start]==nums[end]時,難以確定ox的分界依據,因此需要我們在程式開始時將start向右劃過直到nums[start]153. find minimum in rotated sorted array來做.

852. peak index in a mountain array:

根據比較nums[i]nums[i+1]的關係來區分ox:

在這類題目中,無法形成ooxx的造型,但是仍然能夠根據具體情況硬核分析出保留哪一半,去掉哪一半.

162. find peak element: 在乙個有多個峰的陣列中找到任意乙個峰

這道題目不能構成ooxx的造型,然而可以根據mid所處的位置來具體分析應該留下哪一半作為解:

造型1造型2

造型3造型4

33. search in rotated sorted array: 在迴圈有序陣列中查詢

這道題中的陣列不嚴格有序,不能直接二分查詢,可以仿效153. find minimum in rotated sorted array的思路,先找兩段陣列的分界點,再在兩段有序陣列上分別進行二分查詢.

但是如果題目要求只進行一次二分查詢的話,就要根據mid所處的位置來具體分析應該留下哪一半作為解:

造型1造型2

通過比較nums[mid]nums[-1]值的大小關係,可以確定mid具體位於哪個區間,然後根據target值所在區間來判斷留下哪一半.

二分法 演算法

查詢演算法中的 二分法 是這樣定義的 給定n個從小到大排好序的整數序列list,以及某待查詢整數x,我們的目標是找到x在list中的下標。即若有list i x,則返回i 否則返回 1表示沒有找到。二分法是先找到序列的中點list m 與x進行比較,若相等則返回中點下標 否則,若list m x,則...

演算法 二分法

二分法可以歸為兩大類 二分查詢演算法 二分排序演算法 二分合併演算法 演算法中經常用到二分查詢演算法,比如最常規的應用就是在乙個有序陣列中找特定的數,但是如何寫出乙個完整準確的二分法呢,邊界條件如何判斷,到底是等於還是不等?可能會困惱大家,比如說查詢第乙個等於5的數,那又在如何查詢呢?查詢最後乙個等...

二分法 演算法

二分法查詢,這個演算法要求資料要是有序的。比如有這樣的問題 找出乙個陣列中,兩個數的和小於等於15,然後輸出他們,否則就單獨輸出較大的數。binarysearch.cpp include using namespace std void binarysearch int array,int leng...