一种简单的二分查找思想模型,可以规避细节设置的错误
二分查找也称折半查找(Binary Search),它是一种效率较高(O(logN)的查找方法,前提是数据结构必须先排好序,可以在数据规模的对数时间复杂度内完成查找。但是,二分查找要求线性表具有有随机访问的特点(例如数组),也要求线性表能够根据中间元素的特点推测它两侧元素的性质,以达到缩减问题规模的效果。
二分查找很好理解,但是细节却容易出错。
一种简单的二分查找算法模型
线性表已经排好序,现在目标是设计两个指针l和r使得表划分为两部分,划分结束后的l,r分别指向类分界的两边。
即是说,l=-1,r=num.length
循环进行的条件是:l+1!=r,这样可保证最后结束循环时候,l,r分别再两类中。
一个例题如下
LeetCode Q34
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1,1] 时间复杂度要求(O(logN)
package JavaCode.leetcode.BinarySearch;
public class Q34 {
public static void main(String[] args) {
int[] A={};//根据需要自己写测试的数组即可
int target=5;//目标
int[] ans=searchRange(A,target);
for (int i = 0; i < 2; i++) {
System.out.println(ans[i]);
}
}
public static int[] searchRange(int[] nums, int target) {
int start=findStart(nums, target);
int last=findEnd(nums,target);
int[] A=new int[2];
A[0]=start;A[1]=last;
return A;
}
public static int findStart(int[] nums,int target){
int l=-1,r= nums.length;
while (l+1!=r){
int m=l+(r-l)/2;
if(nums[m]<target){
l=m;
}
else r=m;
}
if(r==nums.length)return -1;
//当数组为空或者target比最大的值更大的时候,返回-1
else if(nums[r]==target) return r ;//存在时返回r
else return -1;//目标不存在时,返回-1
}
public static int findEnd(int[] nums,int target){
int l=-1,r= nums.length;
while (l+1!=r){
int m=l+(r-l)/2;
if(nums[m]<=target){
l=m;
}
else r=m;
}
if (l==-1) return -1;//
else if(nums[
