6、二分查找

复制代码
/**
 *二分查找:要求数组必须是有序的,也就是从小到大或者从大到小
 *
 */
public static void main(String[] args){
    int[] arr={1,2,5,6,18,19,29};
    int findIndex=binarySearch(arr,0,arr.length-1,2);
    System.out.println(findIndex);
}
public static int binarySearch(int[] arr,int left,int right,int findVal){
    //先判断当left>right时,说明没有找到
    if(left>right){
       return -1;
    }
    
    //找到数组的中间下标
    int mid=(left+right)/2;
    //获取中间下标的值
    int midVal=arr[mid];
    if(findVal>midVal){
       //向右递归,因为大于中间值了
       return binarySearch(arr,mid+1,right,findVal);
    }else if(findVal<midVal){
       //向左递归
       return binarySearch(arr,left,right-1,findVal);
    }else{
       //等于中间值,返回中间值的下标;
       return mid;
    }
}





/**
 *在二分查找中,当有多个重复值的时候,如何进行查找
 *有重复值,这里采用集合的方式来返回,其实和找一个值差不多,最主要的是找到值后的不同
 */
public static List<Integer> binarySearch2(int[] arr,int left,int right,int findVal){
        
    if(left>right){
       return new ArrayList<Integer>;
    }
    int mid=(left+right)/2;
    int midVal=arr[mid];
    if(findVal>midVal){
       return binarySearch2(arr,mid+1,right,findVal);
    }else if(findVal<midVal){
       return binarySearch2(arr,left,mid-1,findVal);
    }else{
       //执行到这里说明值已经找到了,然后就是判断是不是多个值了
       //当有多个值的时候,先等下返回,放在集合中
       List<Integer> retIndexList=new ArrayList<Integer>();
       int temp=mid-1;//看左边有没有相同的值
       while(true){
          if(temp<0||arr[temp]!=findVal){
             break;//说明没有了
          }
          //如果没有break,说明有值,添加进集合中
          retIndexList.add(temp);
          temp-=1;//再向左查一个下标
        }
       //把中间的值加进去,也就是刚开始找到的值
       retIndexList.add(mid);

       //然后再看右边有没有相同的值
       temp=mid+1;
       while(true){
          if(temp>arr.length-1||arr[temp]!=findVal){
             break;//右边没有了,跳出循环
          }
          retIndexList.add(temp);
          temp+=1;
       }
       
    }
        //执行到这,整个方法结束,进行返回
    return retIndexList;
}
复制代码

 

posted @   H的世界  阅读(148)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示