(給前端食堂加星標,吃好每一頓)
「觀感度:?????」
「口味:孜然牛肉」
本文已收錄在github
github.com/geekhyt,感謝star。
酒桌上曾經玩過這樣乙個小遊戲,遊戲規則是:主持人每次隨機從 1-1000 中選擇乙個數字,比如是 171。只有主持人自己知道並事先寫在紙條上留存,然後分別讓大家來猜,能夠用最少次數猜到的人獲勝並擁有指定乙個人罰酒的權利。
主持人再次挑選數字,讓扒蒜小妹去猜...
最後,童歐巴用的次數最少,童歐巴獲勝!指定扒蒜小妹罰酒。
這個遊戲就是看誰能使用最少的次數猜到主持人選的數字,誰就獲勝。這種在有序資料集合中的查詢用二分查詢再合適不過了。
二分查詢,顧名思義。(看上文歐巴熟練的灌酒操作也可以知道)每次的查詢都是和區間的中間元素對比,將待查詢的區間縮小為一半,直到找到目標元素,或者區間被縮小為 0 (沒找到)。二分查詢的時間複雜度是o(logn)
。對比常量級時間複雜度,當常量很大時o(999999)
,就會比o(1)
的演算法要高效。
二分演算法雖然高效,但也存在一定的侷限性。想要使二分查詢發揮威力,需要滿足幾個前置條件才行。
33. 搜尋旋轉排序陣列
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。進行旋轉後的陣列( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。
搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。
你可以假設陣列中不存在重複的元素。
你的演算法時間複雜度必須是 o(log n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2], target = 0 輸出: 4
示例 2:
輸入: nums = [4,5,6,7,0,1,2], target = 3 輸出: -1
一定有一部分是有序的
。而且,題目要求時間複雜度為o(logn)
,暗示我們使用二分搜尋。
如上圖中的兩種情況,觀察旋轉後的陣列:
接著我們來判斷target
在哪乙個部分,捨棄另一部分即可。如上圖的第二種情況,我們假設target
是黑色的 3
。mid
在右邊也就是[mid, end]
,target > nums[mid] && target <= nums[end]
,所以捨棄左邊,start = mid + 1
。
const search = function(nums, target)
// 左側有序
if (nums[mid] >= nums[start]) else
} else else }}
return -1;
}
1.看到這裡了就點個在看支援下吧,你的「在看」是我創作的動力。
3.本文已收錄在前端食堂github
github.com/geekhyt,求個小星星,感謝star。
掘金:童歐巴
知乎:童歐巴
這是乙個終身學習的男人,他在堅持自己熱愛的事情,歡迎加入前端食堂,和這個男人一起開心的變胖~
推薦閱讀:
「種樹專業戶」「樹」業有專攻
你不知道的 typescript 泛型(萬字長文,建議收藏)
在看和**是莫大鼓勵❤️
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...
1128 二分 二分查詢
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...
二分查詢及變種二分查詢
二分查詢也稱折半查詢 binary search 它的查詢效率很好。二分查詢有乙個要求是必須採用順序儲存結構,而且表種的元素是有序的。只有滿足這個條件我們才能使用二分查詢。查詢條件 查詢區域的左邊界,小於等於查詢區域的右邊界 查詢過程 1.迴圈條件 查詢條件 2.計算序列中間下標位置 3.如果待查詢...