二分法
二分法,再业务上运行的要比较多。
相比较于通常的暴力循环破解,时间复杂度要从 O(n) -> O(logN)
算法题的解题步骤,我还是习惯于先数学思维,再代码思维。
示例:
leetCode, problem 35
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
输入: nums = [1,3,5,6], target = 5 输出: 2
输入: nums = [1,3,5,6,9,10,20,30,40], target = 2 输出: 1
数学分析:
1.单次循环,时间复杂度为O(n),不符合要求
2.二分查找,符合要求。
第一次二分 -> 直接成功,排除1/2错误选项
第二次二分 -> 直接成功,排除1/4错误选项
如果总数为N,最坏的情况下执行 log(N)次,二分可以得出正确选项。
如果没有计算机,用方程式的话:
如果总数为N,插入的数字为P, F(x) 代表x位置是否应该为P
F(x-1) < = P;
F(x+1) >= P;
0<x<N;
根据上述条件求 x 的值,数学没法进行不定义参数迭代,只能给定固定参数值,可以利用二分,不断枚举得出最优解。
代码分析:
1.一定要有一个不断循环
2.实现一个函数,来确定F(x),是否满足插入位置
int n = nums.length;
int left = 0, right = n - 1, ans = n;
while (left <= right) {
int mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;

浙公网安备 33010602011771号