日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二分查找(一次查找多个相同的值)

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二分查找(一次查找多个相同的值) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.atguigu.search;import java.util.ArrayList; import java.util.List;/*** @創建人 wdl* @創建時間 2021/3/23* @描述*/ //注意:使用二分查找的前提是,該數組是有序的 public class BinarySearch {public static void main(String[] args) {int arr[]={1,8,10,89,1000,1000,1234};int resIndex=binarySearch(arr,0,arr.length-1,-1);System.out.println("resIndex:"+resIndex);List<Integer> resIndexList = binarySearch2(arr, 0, arr.length - 1, 1000);System.out.println("resIndexList="+resIndexList);}//二分查找算法/**** @param arr 數組* @param left 左邊的索引* @param right 右邊的索引* @param findVal 要查找的值* @return 如果找到就返回下標,如果沒有找到,就返回-1*/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,mid-1,findVal);}else {return mid;}}//完成一個課后思考題 // {1,8, 10, 89, 1000, 1000,1234} 當一個有序數組中, // 有多個相同的數值時,如何將所有的數值都查找到,比如這里的 1000.//思路分析//1.在找到mid值,不要馬上返回//2.向mid索引值得左邊掃描,將所有滿足1000,的元素的下標,加入到集合中ArrayList//3.向mid索引值得右邊掃描,將所有滿足1000,的元素的下標,加入到集合中ArrayList//4.將ArrayList返回public static ArrayList<Integer> binarySearch2(int[] arr, int left, int right, int findVal){//當left>right時,說明遞歸整個數組,但是沒有找到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 {ArrayList<Integer> resIndexlist = new ArrayList<>();//向mid索引值得左邊掃描,將所有滿足1000,的元素的下標,加入到集合中ArrayListint temp=mid-1;while(true){if(temp<0||arr[temp]!=findVal){//退出break;}//否則,就把temp放入到集合中resIndexlist.add(temp);temp--;//temp左移}resIndexlist.add(mid);//向mid索引值得右邊掃描,將所有滿足1000,的元素的下標,加入到集合中ArrayListtemp=mid+1;while(true){if(temp>arr.length-1||arr[temp]!=findVal){//退出break;}//否則,就把temp放入到集合中resIndexlist.add(temp);temp++;//temp左移}return resIndexlist;}}}

總結

以上是生活随笔為你收集整理的二分查找(一次查找多个相同的值)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。