力扣刷题--二分法

59 阅读2分钟

二分法(也称为二分搜索)是一种在有序数组中查找特定元素的算法。它的基本思想是将数组分成两部分,然后确定要查找的元素可能在哪一部分。然后再对该部分继续进行二分查找,直到找到目标元素或者确定目标元素不在数组中。

具体步骤如下:

  1. 首先确定数组的中间元素。
  2. 如果目标元素等于中间元素,则找到了目标元素,算法结束。
  3. 如果目标元素小于中间元素,则在数组的左半部分继续查找。
  4. 如果目标元素大于中间元素,则在数组的右半部分继续查找。
  5. 重复以上步骤,直到找到目标元素或者确定目标元素不在数组中。

二分法的时间复杂度为O(log n),是一种高效的查找算法。它在很多场景下都有广泛的应用,比如在查找有序数组、二叉搜索树等数据结构中。

35、搜索插入位置

295、数据流的中位数

这个题其实在100题中是归属堆类型的,但我在写add方法时用的挨个比较然后添加,结果导致运行超时,所以在add方法的遍历改用二分法是ok的不会超时。
错误:

MedianFinder.prototype.addNum = function(num) {
    if(!this.stack.length) {
        this.stack.push(num)
    } else {
        let length= this.stack.length-1
        while(length>=0 && num<this.stack[length]){
            length--
        }
        this.stack.splice(length+1,0,num)
    }

};

优化后 应该还有更好的方法,现在只是写出来了,估计不是最优解,求教!🥹 截屏2024-02-01 12.34.40.png


var MedianFinder = function() {
    
    this.stack = []
};

/** 
 * @param {number} num
 * @return {void}
 */
MedianFinder.prototype.addNum = function(num) {
    let left = 0;
    let right = this.stack.length - 1;
    while (left <= right) {
        let mid = Math.floor((left + right) / 2);
        if (this.stack[mid] < num) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    this.stack.splice(left, 0, num);

};

/**
 * @return {number}
 */
MedianFinder.prototype.findMedian = function () {
  let mind = null;
  let num = Math.floor(this.stack.length / 2);
  if (this.stack.length % 2 === 0) {
    mind = (this.stack[num] + this.stack[num - 1])/2;
  } else {
    mind = this.stack[num];
  }

  return mind
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * var obj = new MedianFinder()
 * obj.addNum(num)
 * var param_2 = obj.findMedian()
 */