二分查找
适用范围:有序数组,无重复元素
题解一(左闭右闭区间):
class Solution {
public int search(int[] nums, int target) {
//获取左边界
int l = 0;
//获取右边界
int r = nums.length - 1;
//左闭右闭区间,l==r有意义
while (r >= l) {
//获取中间索引
int mid = l + (r - l) / 2;
/**
1. target小于中间索引处值,则target处于mid索引的左端(但不等于mid索引处值),即右
边界更新为mid-1,继续搜索;
2. target大于中间索引处值,则target处于mid索引的右端(但不等于mid索引处值),即左
边界更新为mid+1,继续搜索;
3. target等于中间索引处值,则返回mid,停止搜索。
**/
if (nums[mid] > target) {
r = mid - 1;
}else if (nums[mid] < target) {
l = mid + 1;
}else {
return mid;
}
}
//当l>r时,仍未找到target,返回-1
return -1;
}
}
题解二(左闭右开区间):
class Solution {
public int search(int[] nums, int target) {
//获取左边界
int l = 0;
//获取右边界
int r = nums.length;
//左闭右闭区间,l==r无意义
while (r > l) {
//获取中间索引
int mid = l + (r - l) / 2;
/**
1. target小于中间索引处值,则target处于mid索引的左端(但不等于mid索引处值),右边
界为开区间,即右边界更新为mid,继续搜索;
2. target大于中间索引处值,则target处于mid索引的右端(但不等于mid索引处值),即左
边界更新为mid+1,继续搜索;
3. target等于中间索引处值,则返回mid,停止搜索。
**/
if (nums[mid] > target) {
r = mid;
}else if (nums[mid] < target) {
l = mid + 1;
}else {
return mid;
}
}
//当l>r时,仍未找到target,返回-1
return -1;
}
}