二分法(也称为二分搜索)是一种在有序数组中查找特定元素的算法。它的基本思想是将数组分成两部分,然后确定要查找的元素可能在哪一部分。然后再对该部分继续进行二分查找,直到找到目标元素或者确定目标元素不在数组中。
具体步骤如下:
- 首先确定数组的中间元素。
- 如果目标元素等于中间元素,则找到了目标元素,算法结束。
- 如果目标元素小于中间元素,则在数组的左半部分继续查找。
- 如果目标元素大于中间元素,则在数组的右半部分继续查找。
- 重复以上步骤,直到找到目标元素或者确定目标元素不在数组中。
二分法的时间复杂度为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)
}
};
优化后
应该还有更好的方法,现在只是写出来了,估计不是最优解,求教!🥹
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()
*/