二分查找 可以说是我们最先了解的算法之一
目录
二分查找

java
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length -1 ;
while(left <= right){
int mid = left + (right - left) / 3;//防溢出
if(nums[mid] < target)
left = mid + 1;
else if(nums[mid] > target)
right = mid - 1;
else
return mid;
}
return -1;
}
此外 在计算mid方法中 不仅局限于除以 2 本质要减小要查找的范围
已达到O(log n) 时间复杂度的算法
在排序数组查找元素的第一个和最后一个位置

java
public int[] searchRange(int[] nums, int target) {
int [] ret = new int [2];
ret[0] = ret[1] = -1;
//处理边界
if(nums.length == 0)
return ret;
//寻找左端点
int left = 0,right = nums.length - 1;
while(left < right){
int mid = left + (right - left) / 2;
if(nums[mid] < target)
left = mid + 1;
else
right = mid;
}
//判断结果
if(nums[right] != target)
return ret;
else
ret[0] = left;
//寻找右端点
left = 0;
right = nums.length - 1;
while(left < right){
int mid = left + (right - left + 1) / 2;
if(nums[mid] > target)
right = mid - 1;
else
left = mid;
}
//判断结果
if(nums[left] != target)
return ret;
else
ret[1] = right;
return ret ;
}
X的平方根
java
public int mySqrt(int x) {
//不存在时
if(x< 1)
return 0;
long left = 0 , right = x;
while(left < right){
long mid = left + (right - left + 1 ) / 2;
if( mid * mid <= x)
left = mid;
else if(mid * mid > x)
right = mid - 1;
//此时 left == right == mid
}
return(int) left;
}
搜索插入的位置

java
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length ;
while(left < right){
int mid = left + (right - left)/2;
if(nums[mid] < target)
left = mid + 1;
else
right = mid;
}
return left;
}
