蓝桥杯考试 分治法

题目

找到一个数组中比给的数大一点的数

int[]arr={1,3,5,9,12,40,70,85,90,99};

分析:运用分治法,从中间切一刀,看看再切的位置满不满足条件,不满足再在左边或者右边搜索

public class _6_分治_01二分查找1 {

	
	public static int F(int[]arr,int begin,int end,int n)
	{
		if(n<arr[0])			//如果搜索的数比第一个还小 ,返回第一个
			return arr[0];
		if(n>=arr[end-1])		//比最后一个还大,返回-1 找不到
			return -1;
		
		
		int k = (begin+end)/2;	//二分
		if(begin-end == 2)	//如果搜索的数组只有两个了 看看返回的是第一个还是第二个
		{
			return arr[0]>n?arr[0]:arr[1];
		}
		if(arr[k-1]<=n&&arr[k]>n)	//如果刚好在二分的位置,返回
			return arr[k];
		
		if(arr[k]<=n)			//不在二分位置,分别去搜索左边的或右边的
			return F(arr,k,end,n);
		if(arr[k]>n)
			return F(arr,0,k,n);
		return 0;
	}
	
	public static void main(String[] args) {
		int[]arr={1,3,5,9,12,40,70,85,90,99};
		for(int i=0;i<101;i++)
			System.out.println(i+" "+F(arr,0,arr.length,i));
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值