二分法的核心思想是在一个单调有序的范围内,不断比较目标值左右两边的中间值,每次可排除一半范围,不断迭代从而逼近正确答案。
LeetCode 35
35. Search Insert Position
给定一个有序数组,和一个key,求这个key在这个数组中的下标,如果没有对应的数字,则求这个数能够插入的下标
Example 1:
Input: [1,3,5,6], 5 Output: 2
Example 2:
Input: [1,3,5,6], 2 Output: 1
Example 3:
Input: [1,3,5,6], 7 Output: 4
Example 4:
Input: [1,3,5,6], 0 Output: 0
public static int searchInsert(int[] nums, int target) {
int l = 0;
int r = nums.length-1;
while (l <= r) {
int mid = (l+r)/2;
if (target > nums[mid]) l = mid+1;
else if (target < nums[mid]) r = mid-1;
else return mid;
}
return l;
}
LeetCode 61.Sqrt(x)
题意:给定一个数x,求这个数的平方根,平方根只保留整数部分
解法: 初始区间【0,x】通过mid=(0+x)/2, 比较这个数的平方和x的大小,通过不断缩小区间,来逼近目标
这里只是要注意a*a超过了int能表示范围,转换表示a*a<x可以表示为a<x/a;
public class sixty_nine {
public int mySqrt(int x) {
if(x == 1) return 1;
int l = 0;
int r = x;
int mid = 1;
int pow;
while(l < r-1) {
mid = (l+r) / 2;
//if(Integer.MAX_VALUE/mid > mid)原本是想用这样来判断溢出的
pow = mid*mid;
if (mid > x/mid) r = mid;
else if (mid < x/mid) l = mid;
else return mid;
}
return l;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++)
System.out.println(i+" "+new sixty_nine().mySqrt(i));
}
}