演算法題16 二分查詢及相關題目

2021-07-10 11:58:46 字數 1569 閱讀 1494

二分查詢思想就是取中間的數縮小查詢範圍,對應不同的題目變形,在取到中間數mid確定下乙個查詢範圍時也有不同,左邊界有的low=mid+1,也可能low=mid,右邊界有的high=mid-1,也有可能high=mid。

對於乙個排序陣列來說二分查詢的時間複雜度是o(logn)

1. 二分查詢法

1

int binarysearch(int arr,int len,int

target)216

//the array does not contain the target

17return -1

;18 }

2.二分查詢之尋找邊界

這種邊界的尋找分為2種:最後1個小於某數的值,低邊界;第1個大於某數的值,高邊界,情況不同在遍歷查詢時邊界的調整也不同。

1)最後1個小於某數的值

1

int findlastsmallernum(int arr,int len,int

target)221

}2223return -1

;24 }

2) 第1個大於某數的值

1

int findfirstbiggernum(int arr,int len,int

target)221

}2223return -1

;24 }

3. 二分查詢之旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾, 我們稱之陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉, 輸出旋轉陣列的最小元素。例如陣列的乙個旋轉,該陣列的最小值為 1。

仔細觀察會發現旋轉陣列的最小值左邊的數都大於最後乙個數,右邊的數都小於等於最後乙個數,那麼在二分查詢的過程中與最後乙個數比較來調整查詢區間即可

1

int findminnum(int arr,int

len)

2else

if (arr[mid]<=arr[hi])

1518}19

return

arr[lo];

20 }

關於二分查詢, 這篇部落格也有很好的總結。

引述該部落格:

二分查詢法的缺陷

二分查詢法的o(log n)讓它成為十分高效的演算法。不過它的缺陷卻也是那麼明顯的。就在它的限定之上:有序。

我們很難保證我們的陣列都是有序的。當然可以在構建陣列的時候進行排序,可是又落到了第二個瓶頸上:它必須是陣列。

陣列讀取效率是o(1),可是它的插入和刪除某個元素的效率卻是o(n)。因而導致構建有序陣列變成低效的事情。

解決這些缺陷問題更好的方法應該是使用二叉查詢樹了,最好自然是自平衡二叉查詢樹了,自能高效的(o(n log n))構建有序元素集合,又能如同二分查詢法一樣快速(o(log n))的搜尋目標數。

二分查詢模板及題目

二分模板一共有兩個,分別適用於不同情況。演算法思路 假設目標值在閉區間 l,r 中,每次將區間長度縮小一半,當l r時,我們就找到了目標值。版本1當我們將區間 l,r 劃分成 l,mid 和 mid 1,r 時,其更新操作是r mid或者l mid 1 計算mid時不需要加1。c 模板 int bs...

題目1 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...

題目1 二分 二分查詢

link 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩...