时间复杂度O(log n):表示计算得时间为n得一半
下面通过一个例子来解析一下二分算法(个人理解):
在给定一个数组与一个目标值target,若数组中有等于target得值,返回对应得下标,没有对应得值则返回应该插入得下标位置,数组是递增得,要求时间复杂度为O(log n):
nums
为 无重复元素 的 升序 排列数组
编写对应代码:
因为时间复杂度需要O(log n) ,而二分算法刚好满足这个时间复杂度,因为每次搜索只查询数组得一半。
public class Algorithm {
public int binarySearch(int[]nums, int target) {
int left = 0; //数组最左边对应得下标
int right = nums.length - 1; //数组最右边对应得下标
while(left <= right) { //当left > right时结束循环
int mid = left + (right - left) / 2; //获得数组得中间值
if(nums[mid] == target) {
return mid;
} else if(nums[mid] > target) { //如果中间下标得值大于目标值,,因为数组是递增的,右边部分所有的值会比中间值大,那么说明目标值在中间值得左边,那么就将right = mid - 1;
right = mid - 1;
} else if(nums[mid] < target) { //同理,中间值小于目标值,因为递增数组,中间值左边的所有数值都会小于目标值,那么目标值就在中间值的右边部分,那么将left的下标变为mid + 1;
left = mid + 1;
}
}
//若没有等于的目标值,那么返回左边的值
return left;
}
}
图像表示:
星号★:表示方法里里面代码执行的顺序
圆形⭕:表示循环里面执行的步骤