1. 程式人生 > 其它 >LeetCode題解:704.二分查詢

LeetCode題解:704.二分查詢

技術標籤:【演算法與資料結構】# 解題思想:二分法二分查詢leetcodejavascript資料結構二分法

二分查詢(easy)

更好的閱讀體驗應該是:

  1. 審題-思考
  2. 答題
  3. 整理-歸納

一、題目

LeetCode:704.二分查詢

給定一個 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

  1. 確定初始的左右邊界:
    • left: 0
    • right: nums.length-1
    • mid: (left + right) >> 1
  2. 如果中間元素值nums[mid] < target:證明中間值左側包括中間值都不符合要求,可以直接排除,left = mid + 1
  3. 如果中間元素值nums[mid]:證明中間值右側包括中間值都不符合要求,可以直接排除,right = mid - 1
  4. 如果中間元素值nums[mid] = target:直接返回mid的下標
  5. 重新定義了左右邊界,也需要重新計算中間值,我們需要繼續進行範圍的排除
  6. 定義搜尋的條件,應該是搜尋區間都不為空,即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,水平有限,虛心學習中

其他沉澱