二分查找(一次查找多个相同的值)
生活随笔
收集整理的這篇文章主要介紹了
二分查找(一次查找多个相同的值)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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;}}}
總結
以上是生活随笔為你收集整理的二分查找(一次查找多个相同的值)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二分查找+思路分析
- 下一篇: 插值查找+代码实现+注意事项