二分查找法

二分查找法

import java.util.ArrayList;
import java.util.List;
/**
* @author scXu:
* @version 创建时间:2021年5月24日 上午8:36:04
* 二分查找
* 查找一个相同元素
* 查找多个相同元素
*/
public class BinarySearch {
	public static void main(String[] args) {
		 int[] arr = {1,3,4,6,6,6,6,6,6,6,7,9,19};
		 //查找一个相同元素
		 //int resIndex = binarySearch(arr,0,arr.length-1,6);
		 //System.out.println(resIndex);
		 //查找多个相同元素
		 List<Integer> binarySearch2 = binarySearch2(arr,0,arr.length-1,6);
		 System.out.println(binarySearch2);
	}
	//二分查找-递归 (只能查找到一个)
	public static int binarySearch(int[] arr,int left, int right,int findValue){
		//如果没找到则返回-1,跳出递归
		if(left > right){
			return -1;
		}
		int mid = (left + right) /2;
		int midValue = arr[mid];
		if(findValue < midValue){  //向左递归
			return binarySearch(arr,left,mid-1,findValue);
		}else if(findValue > midValue){ //向右递归
			return binarySearch(arr,mid+1,right,findValue);
		}else{
			return mid;//返回结果
		}
	}
	
	//二分查找-递归(查找多个) 使用List集合存放元素下标
	public static List<Integer> binarySearch2(int[] arr,int left, int right,int findValue){
		//没找到元素,跳出递归,返回空集合
		if(left > right){
			return new ArrayList<Integer>();
		}
		int mid = (left + right) /2;
		int midValue = arr[mid];
		if(findValue < midValue){  //向左递归
			return binarySearch2(arr,left,mid-1,findValue);
		}else if(findValue > midValue){ //向右递归
			return binarySearch2(arr,mid+1,right,findValue);
		}else{//分别向左向右收集相同元素的下标
			List<Integer> list = new ArrayList<>();
			int temp = mid - 1;
			while(true){  //向左收集
				if(temp < 0 || arr[temp] != findValue){
					break;
				}
				list.add(temp);  //下标加入集合
				temp --;
			}
			list.add(mid);
			temp = mid + 1;
			while(true){ //向右收集
				if(temp > arr.length-1 || arr[temp] != findValue){
					break;
				}
				list.add(temp);  //下标加入集合
				temp ++;
			}
			return list;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值