通过二分搜索方式实现
- 时间复杂度:O (logn)
- 空间复杂度:O (1)
解题步骤
- 从数组的中间元素开始,如果中间元素正好是目标值,则搜索过程结束
如果目标值大于或者小于中间元素,则在数组大于或者小于中间元素的那一半中查找
function guessNumber(n) {let low = 1;let high = n;while (low <= high) {const mid = Math.floor((low + high) / 2);const res = guess(mid);if (res === 0) {return mid;} else if (res === 1) {low = mid + 1;} else {high = mid - 1;}}}
由于每次搜索范围都会缩小一半,所以时间复杂度是 O (logn)。而空间复杂度是 O (1),因为没有存储会随着数据增大而增加的变量。
通过分而治之 & 二分搜索方式实现
- 时间复杂度:O (logn)
- 空间复杂度:O (logn)
解题步骤
- 分:计算中间元素,分割数组
- 解:对分割的子数组进行二分搜索
合:不需要此步骤,因为在子数组中搜索到了就返回
function guessNumber(n) {const rec = (low, high) => {if (low > high) return;const mid = Math.floor((low + high) / 2);const res = guess(mid);if (res === 0) {return mid;} else if (res === 1) {return rec(mid + 1, high);} else {return rec(low, mid - 1);}};return rec(1, n);}
由于每次搜索范围都会缩小一半,所以时间复杂度是 O (logn)。而空间复杂度是 O (logn),因为使用了递归,形成了调用堆栈,调用堆栈的层数就是二分的次数。在此处只是用来学习分而治之的思想,来解决一些问题。但是平时使用二分搜索时,尽量使用迭代方式,避免使用递归方式。
