例1(js):
/*
二分法:
查找升序排列的数组中的某个值,并返回其序号,没有则返回-1
规定左右区域,设定该区域的中间序号mid
若中间对应值小于目标值,则令左边边界等于中间值+1,使下一步比较在mid右边进行
若中间对应值大于目标值,则令右边边界值等于中间值-1,使下一步比较在mid左边进行
若中间对应值等于目标值,则输出中间值
*/
var search = function (nums, target) {
// var nums = [-1, 0, 3, 5, 9, 12];
// var target = 9;
var low = 0;
var high = nums.length - 1;
while (low <= high) {
var mid = Math.floor((high - low) / 2) + low;
// 若中间对应值等于目标值,则输出中间值
if (nums[mid] === target) {
return mid;
}
// 若中间对应值大于目标值,则令右边边界值等于中间值-1,使下一步比较在mid左边进行
else if (nums[mid] > target) {
high = mid - 1;
}
// 若中间对应值小于目标值,则令左边边界等于中间值+1,使下一步比较在mid右边进行
else {
low = mid + 1;
}
}
// 若没有找到则返回-1
return -1;
};
console.log(search([-1, 0, 3, 5, 9, 12], 9));
例2(python):
//查找错误版本号,返回最初错误的版本号
//思路:设置左右区域,得到中间值,若中间值错误(返回true),则说明前面可能有版本号错误,则令right = mid - 1,若中间值返回false,则left = mid + 1。
//直到left = right时,说明已经是最初错误的版本号
//注意python语法。。。我这记性
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
l = 1
r = n
while l<=r:
m = (r+l)//2
if isBadVersion(m):
r = m-1
else:
l = m+1
return l
例3:
//给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
//请必须使用时间复杂度为 O(log n) 的算法。
def searchInsert(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
l = 0
r = len(nums) - 1
while l <= r :
m = (r + l)//2
if nums[m]<target :
l = m+1
elif nums[m]>target :
r = m-1
else :
//找到返回m
return m
//找不到返回左值
return l