二分查找(递归+while)、LIS(动态规划+二分)、
lowerBound、upperBound
public static int binarySearch(int[] array,int target){
int low = 0;
int high = array.length-1;
int middle = 0;
if(target < array[low] || target > array[high] || array[low] > array[high] ){
return -1;
}
while(low <= high){
middle = (low + high)/2;
if(target < array[middle]){
high = middle-1;
}else if(target > array[middle]){
low = middle+1;
}else {
return middle;
}
}
return -1;
}
public static int recursionBinarySearch(int[] array, int target, int low, int high){
int middle = (low + high)/2;
if(target < array[low] || target > array[high] || array[low] > array[high] ){
return -1;
}
if(target < array[middle]){
return recursionBinarySearch(array,target,low,middle-1);
}else if(target > array[middle]){
return recursionBinarySearch(array,target,middle+1,high);
}else {
return middle;
}
}
public static int lowerBound(int[] nums, int l, int r, int target){
while(l<r){
int m = (l+r)/2;
if(nums[m]>=target) r= m;
else l = m +1;
}
return l;
}
public static int lowerBound2(int[] nums,int l,int r,int target){
while(l<=r){
int m = (l+r)/2;
if(nums[m]>=target) r= m-1;
else l = m +1;
}
return l;
}
public static int upperBound(int []nums ,int l,int r, int target){
while(l<r){
int m = (l+r)/2;
if(nums[m]<=target) l = m+1;
else r = m;
}
return l;
}