靠近左、右的二分搜索例程
2017-03-22 16:27
239 查看
靠近左:只有当arr[mid]<target时才向右,下界lo推进,mid=lo+((hi-lo)>>1),最后位置在lo
靠近右:只有当arr[mid]>target时才向左,上界hi推进,mid=lo+((hi-lo+1)>>1),最后位置在hi
public class test649 {
public static void main(String[] args) {
int[] arr={1,1,1,1,2,2,3,4,5,6,6,6,7,7,7,7,7,8,9,10,10,17,18,20};
System.out.println(binaryLeftSearch(arr, 7));
System.out.println(binaryRightSearch(arr, 7));
System.out.println();
}
public static int binaryLeftSearch(int[] arr,int target){
int len=arr.length;
int lo=0,hi=len-1;
while(lo<hi){
int mid=lo+(hi-lo)/2;
if(arr[mid]<target){
lo=mid+1;
}
else{
hi=mid;
}
}
return lo;
}
public static int binaryRightSearch(int[] arr,int target){
int len=arr.length;
int lo=0,hi=len-1;
while(lo<hi){
int mid=lo+(hi-lo+1)/2;
if(arr[mid]>target){
hi=mid-1;
}
else{
lo=mid;
}
}
return hi;
}
}
输出
12
16
靠近右:只有当arr[mid]>target时才向左,上界hi推进,mid=lo+((hi-lo+1)>>1),最后位置在hi
public class test649 {
public static void main(String[] args) {
int[] arr={1,1,1,1,2,2,3,4,5,6,6,6,7,7,7,7,7,8,9,10,10,17,18,20};
System.out.println(binaryLeftSearch(arr, 7));
System.out.println(binaryRightSearch(arr, 7));
System.out.println();
}
public static int binaryLeftSearch(int[] arr,int target){
int len=arr.length;
int lo=0,hi=len-1;
while(lo<hi){
int mid=lo+(hi-lo)/2;
if(arr[mid]<target){
lo=mid+1;
}
else{
hi=mid;
}
}
return lo;
}
public static int binaryRightSearch(int[] arr,int target){
int len=arr.length;
int lo=0,hi=len-1;
while(lo<hi){
int mid=lo+(hi-lo+1)/2;
if(arr[mid]>target){
hi=mid-1;
}
else{
lo=mid;
}
}
return hi;
}
}
输出
12
16
相关文章推荐
- POJ 3258 River Hopscotch(二分搜索巧妙利用)
- hdu 2141 二分搜索
- Subsequence 【poj-3061】【二分搜索】
- 二分搜索
- poj 2976(01分数规划搜索+二分答案)
- NYOJ 586 疯牛 & POJ 2456(二分搜索 + 贪心)(最大化最小值)
- POJ_1019_Number Sequence_二分搜索
- nyoj 疯牛(二分搜索+贪心)
- C. Modified GCD(二分加搜索约数)
- 一些重要的算法------启发式搜索,束搜索(beam search),二分查找算法 and so on............
- 第一篇,写个shi作的hello吧(二分搜索)
- 二分搜索
- 二分搜索——不光是查找值
- NYOJ 914 Yougth的最大化(二分搜索 + 贪心)
- 二分搜索及其扩展
- POJ1064 Cable master(二分搜索)
- 二分搜索树的基础结构
- codeforces 895B. XK Segments (二分搜索)
- 【算法设计与分析】3、二分搜索
- python实现二分搜索树以及改进后的AVL Tree