1.查找目标值
关键概念:区间初始值,循环条件,判断&区间缩减,最终返回值。
- 区间初始值:左闭右闭的
[left, right]
,覆盖掉所有可能取值。 - 循环条件:
while(left < right)
,当left == right
表示找到唯一值 - 判断&区间缩减:看题目
- 返回值:按照题意分析
public int binarySearch(int[] A, int left, int right, int target){
int mid;
while(left <= right){
mid = left + (right-left)/2;
if(A[mid] > target){
right = mid - 1;//大于等于和大于均是这个写法
}else if(A[mid] < target){
left = mid + 1;
}else{
return left;
}
}
return -1;
}
2.寻找第一个满足条件的位置
public int binarySearch(int[] A, int left, int right, int target){
int mid;
while(left < right){
mid = left + (right-left)/2;
//例如,第一个大于等于target的位置,A[mid] >= target,
//如果条件中有/mid,需要保证mid!=0。
if(条件){
right = mid;//大于等于和大于均是这个写法
}else{
left = mid + 1;
}
}
return left;
}
例子1:计算sqrt(2)
,用法:单调+区间
public static void main(){
int eps = 1e-5;
int left = 1;
int right = 2;
int mid;
while(right - left > eps){
mid = left + (right - left)/2;
if(f(mid)>2){
right = mid;
}else{
left = mid;
}
}
return left;
}
double f(double x){
return x * x;
}
例子2:快速幂
//递归方法
long binaryPow(int a, int n){
if(n == 0){
return 1;
}
if(b & 2 == 1){
return a * binaryPow(a, n-1);
}else{
long mul = binaryPow(a, n/2);//注意此处先赋值
return mul*mul;
}
}
//迭代方法
long binaryPow(int a, int n){
long ans = 1;
while(b > 0){
if(b & 1 == 1){
ans *= a;
}
a = a * a;
b>>=1;//b = b>>1;相当于b = b/2;
}
}
3.牛顿迭代法
判断是否为完全平方数
class Solution {
public boolean isPerfectSquare(int num) {
//设置初始值,在求解结果的右侧
double x0 = num;
while (true) {
//下一个迭代点和当前迭代点的关系
double x1 = (x0 + num / x0) / 2;
if (x0 - x1 < 1e-6) {
break;
}
x0 = x1;
}
//验证结果
int x = (int) x0;
return x * x == num;
}
}