研习算法第十站-搜索算法(javascript版)

182 阅读1分钟

搜索算法

  • 顺序搜索
  • 二分搜索
  • ...

顺序搜索思路

  • 遍历数组
  • 找到跟目标值相等的元素,就返回它的下标
  • 遍历结束后,如果没有搜索到目标值,就返回 -1
Array.prototype.sequentialSearch = function (item) {
  for (let i = 0; i < this.length; i++) {
    if (this[i] === item) {
      return i;
    }
  }
  return -1;
};
console.log([3, 5, 6, 78, 8].sequentialSearch(8));

二分搜索思路(有序数组)

  • 从数组的中间元素开始,如果中间元素正好是目标值,则搜索结束
  • 如果目标值大于或者小于中间元素,则在大于或小于中间元素的那一半数组中搜索
Array.prototype.binarySearch = function (item) {
  let low = 0;
  let high = this.length - 1;
  while (low <= high) {
    const mid = Math.floor((low + high) / 2);
    const ele = this[mid];
    if (ele < item) {
      low = mid + 1;
    } else if (ele > item) {
      high = mid - 1;
    } else {
      return mid;
    }
  }
  return -1;
};
console.log([1, 2, 3, 4, 5, 6, 7].binarySearch(0));

leetcode-cn.com 算法题实战

完整题目请打开 leetcode

374. 猜数字大小

image.png

解题思路

  • 这不就是二分搜索
  • 调用guess函数,来判断中间元素是否有目标值
  • 从数组的中间元素开始,如果中间元素正好是目标值,则搜索结束
  • 如果目标值大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找
/** 
 * Forward declaration of guess API.
 * @param {number} num   your guess
 * @return 	            -1 if num is lower than the guess number
 *			             1 if num is higher than the guess number
 *                       otherwise return 0
 * var guess = function(num) {}
 */

/**
 * @param {number} n
 * @return {number}
 */
var guessNumber = function(n) {
  let low = 0;
  let height = n
  while(low <= height) {
      let mid = Math.floor((low + height) /2)
      const res = guess(mid)
      if(res === 0) {
          return mid;
      } else if(res === -1) {
          height = mid - 1;
      } else {
          low = mid + 1;
      }
  } 
};

下一站 分而治之