LeetCode題解:704.二分查詢
阿新 • • 發佈:2020-12-10
技術標籤:【演算法與資料結構】# 解題思想:二分法二分查詢leetcodejavascript資料結構二分法
二分查詢(easy)
更好的閱讀體驗應該是:
- 審題-思考
- 答題
- 整理-歸納
一、題目
給定一個 n
個元素有序的(升序)整型陣列 nums
和一個目標值 target
,寫一個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 -1。
示例:
輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現在 nums 中並且下標為 4
你可以假設 nums 中的所有元素是不重複的。
二、二分法解題
二分查詢是一種基於比較目標值和陣列中間元素的教科書式演算法。
- 如果目標值等於中間元素,則找到目標值。
- 如果目標值較小,繼續在左側搜尋。
- 如果目標值較大,則繼續在右側搜尋。
時間複雜度:O(logN)
。
空間複雜度:O(1)
。
模版 I
- 確定初始的左右邊界:
left
: 0right
: nums.length-1mid
: (left + right) >> 1
- 如果中間元素值
nums[mid]
< target:證明中間值左側包括中間值都不符合要求,可以直接排除,left = mid + 1
- 如果中間元素值
nums[mid]
:證明中間值右側包括中間值都不符合要求,可以直接排除,right = mid - 1
- 如果中間元素值
nums[mid]
= target:直接返回mid
的下標 - 重新定義了左右邊界,也需要重新計算中間值,我們需要繼續進行範圍的排除
- 定義搜尋的條件,應該是搜尋區間都不為空,即
left <= right
Javasciprt 程式碼
var search = function(nums, target) {
let left = 0; // 初始左邊界
let right = nums.length - 1; // 初始右邊界
// 如果left > right 證明整個陣列結束了仍沒有找到目標值
while (left <= right) {
let mid = left + Math.floor((right - left) / 2); //防止溢位
if (target === nums[mid]) {
return mid;
} else if (target > nums[mid]) {
// 目標值大於中值,則中間左側可以拋棄了
left = mid + 1;
} else {
// 目標值小於中值,則中間右側可以拋棄了
right = mid - 1;
}
}
return -1;
};
三、寫在最後
上面的程式碼就是二分法模板 I,看過我的二分法總結的同學應該知道,憑藉這套模版以及對應的分析,類似的問題應該難不住你了。
如果對你有所幫助不妨給本專案的github 點個 star,這是對我最大的鼓勵。
關於我
- 花名:餘光
- WX:j565017805
- 沉迷 JS,水平有限,虛心學習中
其他沉澱