二分查找算法框架
框架练习题
力扣上的二分查找练习地址
int binarySearch(int[] nums, int target) {
int left = 0, right = nums.length-1;
//开始循环,循环一般条件是left <= right
while(...) {
//这是固定,你也可以将除法转化为位运算mid = left + ((right - left) >> 1);因为位运算比除法相对好一点
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
...
} else if (nums[mid] < target) {
left = ...
} else if (nums[mid] > target) {
right = ...
}
}
return ...;
}
框架练练手
1.查找给定的数(基本的二分搜索)
- 这种题是大家最熟悉的,查找一个数字,如果存在就返回其索引,否则返回-1;(二分查找前提,数组是有序的)
public static int binarySearch(int[] nums,int target){
int left = 0;
int right = nums.length-1;
while(left <= right){
int mid = left + (right-left)/2;
if(nums[mid] == target){
return mid;//返回索引
}else if (nums[mid] < target){
left = mid + 1;
}else{//nums[mid] > target
right = mid - 1;
}
}
return -1;
}
2.在排序数组中查找元素的第一个和最后一个位置
class Solution {
public int[] searchRange(int[] nums, int target) {
int start = 0;
int end = nums.length - 1;
int mid = (start + end) / 2;
boolean flag = false;
while(start <= end) {
mid = (start + end) / 2;
if(nums[mid] < target) {
start = mid + 1;
}else if(nums[mid] > target) {
end = mid - 1;
}else {
flag = true;
break;
}
}
if(flag) {
int left = mid ;
int right = mid ;
//向俩边扩展
while(left - 1 >= 0 && nums[left - 1] == target) {
left--;
}
while(right + 1 <= nums.length - 1 && nums[right + 1] == target) {
right++;
}
return new int[]{left,right};
}else {
return new int[]{-1,-1};
}
}
}