二分法边界一直处理不好?试试防御式编程
二分法有三种模板,大佬总是能灵活运用,但这就苦了我们这些菜鸡。
个人的解决办法就是多判断一下边界,采取防御式编程,这样就只需要记一个模板就好了(雾
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... }