二分法边界一直处理不好?试试防御式编程
二分法有三种模板,大佬总是能灵活运用,但这就苦了我们这些菜鸡。
个人的解决办法就是多判断一下边界,采取防御式编程,这样就只需要记一个模板就好了(雾
import java.util.*;
public class Solution {
/**
* 二分查找
* @param n int整型 数组长度
* @param v int整型 查找值
* @param a int整型一维数组 有序数组
* @return int整型
*/
public int upper_bound_ (int n, int v, int[] a) {
// write code here
int left=0,right=n-1;
while(left<=right){
int mid=left+(right-left)/2;
if(a[mid]<v){
left=mid+1;
}else if(a[mid]>=v){
//如果数组中的第一个元素就大于目标值,那就直接加1返回
if(mid==0) return mid+1;
//判断一下是否为第一个大于等于的位置,利用了数组是有序的条件
if(a[mid-1]>=v) {right=mid-1;}
else return mid+1;
}
}
return n+1;
}
}总结下来就是,你只需要记住下面这个模板就好,在条件语句中多进行边界判断
int left=0,right=n-1;
while(left<=right){
int mid=left+(right-left)/2;
//if....
//else...
}


京公网安备 11010502036488号