我相信很多人都知道其思路,我也是那很多人之一 但当我开始着手写代码时,才发现自己一直报错...
重点:中间点的索引值计算,这与区间有关
这里采取左闭右闭
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let l = 0
let r = nums.length - 1
while(l <= r){
// mid的计算要考虑到数组长度为1、2的情况
const mid = l + Math.floor((r -l) / 2)
if(nums[mid] === target) {
return mid
}
if(nums[mid] > target) {
// 为什么不能使用下面第一个呢?
// r = mid
r = mid - 1
} else {
// l = mid
l = mid + 1
}
}
return -1
};
总结:算法里你需要考虑逻辑是什么,具体每一步应该是怎么实现,对应各种情况又有不同
疑惑:虽然理解在给 r和l 赋值时要分别 -1和+1,但我还是不太能理解为啥直接赋值为 mid 不行 调试了一会儿,也暂时没发现会有啥测试用例不会通过,之后发现了会及时更新文章的