刚学完二分法时,觉得这个太弱了,只能在一个有序的数组中找特定的元素。实际上,二分法远比我想象中的强大。二分法的基本功能是在一个区间中找到目标值。有很多问题,都可以描述成在区间内查找一个值来解决。
最近遇到一道算法题,求一个浮点数的立方根。一开始怎么也没想到用二分法来解决,见代码,
public double func(double x) {
if (x == 0 || x == 1 || x == -1) {
return x;
}
double left = x > 0 ? 0 : x;
double right = x > 0 ? x : 0;
double mid;
double target;
while (left < right) {
mid = (left + right) / 2;
target = mid * mid * mid;
if (target > x) {
right = mid;
} else if (target < x) {
left = mid;
} else {
return mid;
}
}
return 0;
}
不管是求一个数的平方根还是立方根,都可以采用二分法的思维来处理,最终的结果都在一个有序的区间中。