牛客網常見演算法思路 六 二分搜尋

2021-10-02 07:24:36 字數 1266 閱讀 3273

常見應用場景

有序序列查詢乙個數

並不一定要在有用部分才得到應用(題目課件)

考察點:

對邊界條件的考察

有無重複值的條件是不同的

給定無序陣列arr,已知任意相鄰的兩個元素,值不重複,返回任意乙個區域性最小的值

區域性最小: 若arr[0]1,n-1>n-2,整個陣列往中間靠有向下的趨勢

直接看mid,如mid符合,則返回mid,否則,若midmid+1,則前半部有向下趨勢,對前半部分進行二分查詢,後mid>mid-1的情況同理

給定有序迴圈陣列arr,返回arr中的最小值。

有序迴圈陣列指左邊任意長度放到右邊,右邊任意長度放到左邊,12345、51234都算有序迴圈

思路:1、若arr[l]arr[m]則最小值只會出現在l-m上(因為此時l-m是迴圈部分)

3、否則,最小值只會在m-r上

4、若a[l]>=a[r],a[l]<=a[m],a[m]<=[r] ==> 222212222,此時要用遍歷方法

給定有序不重複陣列,請找出滿足a[i]==i條件的最左位置。如果所有位置上的數都不滿足則返回-1.

思路:1、若a[0]>n-1,直接返回-1

2、若a[n-1]<0,直接返回-1

3、a[m]>m.則,看左邊

4、a[m]給定完全二叉樹頭結點head,返回這棵樹的節點個數,如果完全二叉樹的節點數為n,遍歷複雜度為o(n),最優解複雜度o(logh²),h為高度

思路:因為完全二叉樹性質,每層從左往右增加節點

1、找到完全二叉樹最左的節點-》獲得二叉樹高度

2、找到頭結點右子樹的最左節點,若能達到最後一層,則證明頭結點的左子樹為滿二叉樹,公式直接計算左子樹節點個數,並按遞迴步驟2求右子樹節點個數

3、 而若頭節點有子樹的最左節點未能到達最後一層,則證明頭結點右子樹為滿二叉樹(比左子樹少一層),公式計算右子樹節點個數。遞迴步驟2求左子樹節點個數

4、加上頭結點

如何用更快的方式求整數k的n次方,如果兩個整數相乘並得到結果的時間複雜度為o(1),得到整數k的n次方的過程實現複雜度o(logn)

思路:普通做法:k乘n-1次

最優解:

設10的75次方

1、次數拆解成二進位制1001011(7位數)

2、用翻倍的方式求10的n次方,翻7次,10的1次,10的2次,10的4次,10的8次,10的16次,10的32次,10的64次

3、 二進位制為1的位數與步驟2的數相乘,110的64次+0+10的32次+010的16次+110的8次+010的4次+110的2次+1*10的1次

牛客網 去哪兒網 二分查詢

對於乙個有序陣列,我們通常採用二分查詢的方式來定位某一元素,請編寫二分查詢的演算法,在陣列中查詢指定元素。給定乙個整數陣列a及它的大小n,同時給定要查詢的元素val,請返回它在陣列中的位置 從0開始 若不存在該元素,返回 1。若該元素出現多次,請返回第一次出現的位置。測試樣例 1,3,5,7,9 5...

演算法基礎 典型題(六)二分搜尋 與 二分查詢樹

記錄演算法基礎題思路 step1 插入位置查詢 給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。示例 輸入 1,3,5,6 5 輸出 2 int searchinsert vector nums,in...

牛客網 吃貨 (二分模擬)

作為乙個標準的吃貨,mostshy又打算去聯建商業街覓食了。混跡於商業街已久,mostshy已經知道了商業街的所有美食與其 而且他給每種美食都賦予了乙個美味度,美味度越高表示他越喜愛這種美食。mostshy想知道,假如帶t元去商業街,只能吃一種食物,能夠品味到的美食的美味度最高是多少?第一行是乙個整...