感觉还是跟着网上大佬的刷题路线走会比较好,不想去找了,就跟着以前关注过的代码随想录刷下去吧。
第一题是二分查找
太久没刷题就会忘记,差点忘了取两个数的中间值的方法
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;
}
}
十一点睡觉,晚安。