一个数组升序排列 找到目标值
解读:
从下标来看
-
将数组的第0位设为left
-
最后一位设为right
-
向下取right和left的平均数用Math.floor() 等于mid
-
如果目标值等于mid所存的值 返回该下标
如果目标值大于mid所存的值 目标值在右边找 让左边left等于mid+1
如果目标值小于mid所存的值 目标值在左边找 让左边right等于mid-1 -
mid = Math.floor(left + (right - left) / 2)的原因是
假如right和left都是一个很大的数,
那么right + left会溢出,
而(right - left)/2 + left 先做减法不会溢出。
代码:
<script>
function search(nums, target) {
for (let left = 0, right = nums.length - 1; left <= right;) {
// let mid = Math.floor((left + right) / 2);
mid = Math.floor(left + (right - left) / 2)
if (target == nums[mid]) { return mid; }
else if (target < nums[mid]) { right = mid - 1; }
else if (target > nums[mid]) {
left = mid + 1;
}
}
return -1
};
console.log(search([-1, 0, 3, 5, 9, 12], 3));
</script>