二分查找法(數組相關)

背景需求:給定一個有序數組(不是有序數組不能用二分查找法)以及一個值,如果查找成功返回目標的索引值;否則返回-1。當待搜索的集合是相對靜態的數據集時,此時使用二分查找是最好的選擇

主要考慮的點:邊界值的處理

思路:開始時,先找出有序集合中間的那個元素。如果此元素比要查找的元素大,就接着在較小的一個半區進行查找;反之,如果此元素比要找的元素小,就在較大的一個半區進行查找。在每個更小的數據集中重複這個查找過程,直到找到要查找的元素或者數據集不能再分割。

圖解:

left、right 表示索引

function binarySearch (arr, target) {
      let left = 0 //  初始化,左邊界是數組第一個索引
      let right = arr.length - 1 // 初始化右邊界是數組最後一個索引
      while(left <= right) {
        let middleNum = parseInt((left + right) / 2, 10) // 中間索引
        if (target < arr[middleNum]) {
          right = middleNum - 1 // 說明target 在左側 重新賦值右索引
        } else if (target > arr[middleNum]) {
          left = middleNum + 1  // 說明target 在右側 重新賦值左索引
        } else {
          return middleNum
        }
      }
      return -1 // 沒找到 返回-1
    }

例題:

給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。

雙指針問題:

<script>
    let arr = [1, 0, 3, 5, 0, 6, 0, 7]
    var moveZeroes = function(nums) {
      var key = 0 // 指針
      var index = 0 // 索引
      while(index < nums.length) {
        if (nums[index] !== 0) {
           // 重新賦值
          nums[key] = nums[index]
          ++index
          ++key
        } else {
          ++index
        }
      }
      // 其餘填充0
      for(var i = key; i < index; i++) {
        nums[i] = 0
      }
      return nums
    };
    console.log(moveZeroes(arr))
  </script>

雙指針交換位置:

 let arr = [1, 0, 3, 5, 0, 6, 0, 7]
    var moveZeroes = function(nums) {
      var key = 0 // 指針
      var index = 0 // 索引
      while(index < nums.length) {
        if (nums[index] !== 0) {
          // 交換位置
          temp = nums[index]
          nums[index] = nums[key]
          nums[key] = temp
          ++index
          ++key
        } else {
          ++index
        }
      }
      return nums
    };
    console.log(moveZeroes(arr))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章