从新开始刷题

81 阅读1分钟

感觉还是跟着网上大佬的刷题路线走会比较好,不想去找了,就跟着以前关注过的代码随想录刷下去吧。

第一题是二分查找

太久没刷题就会忘记,差点忘了取两个数的中间值的方法

int mid = left + (right - left) / 2;
int mid = left + ((right - left) >> 1); // 位运算,右移一位相当于除以2

我还是更喜欢左闭右闭区间的方法,感觉更容易理解。对应的二分查找代码就是

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

既然是打算认真学,那就得直面以前想逃避的东西,比如说左闭右开区间写法,大致看着就是:

设右边是取不到的,right就可以是arr.length(arr.length数组取不到);当target已经小于arr[mid]时,目标在左半区间,右边界就设置成mid,这个时候已经不取右边界了,始终保持同个原则(目标不会是右边界)。

int left = 0, right = arr.length;  // 右边取不到
while(left < right){
    int mid = left + ((right - left) >> 1);
    if(arr[mid] < target){
        left = mid + 1;
    }else if(arr[mid] > target){
        right = mid;
    }else{
        return mid;
    }
}

十一点睡觉,晚安。