MINMAX问题

算法设计技巧与分析102页算法6.1

利用分治的思想从数组中找出最大值与最小值,时间复杂度为O(logn).

算法很简单就不多说了,直接上代码吧

/**
 * 
 * @author yyd
 * 在(n)时间复杂度内求出某个输入数组的最大数与最小数
 *
 */
public class MINMAX6_1 {
	
	public static Map minmax(int a[],int low,int high){
		Map<String,Integer> map=new HashMap<String,Integer>();
		if(high==low){
			map.put("min", a[low]);
			map.put("max", a[low]);
			return map;
		}
		if(high-low==1){
			if(a[high]>=a[low]){
				map.put("min", a[low]);
				map.put("max", a[high]);
			}
			else{
				map.put("min", a[high]);
				map.put("max", a[low]);
			}
			return map;
		}
		else{
			int mid=(high+low)/2;
			Map<String,Integer> m1=minmax(a,low,mid);
			Map<String,Integer> m2=minmax(a,mid+1,high);
			if(m1.get("min")<=m2.get("min")){
				map.put("min", m1.get("min"));
			}
			else{
				map.put("min", m2.get("min"));
			}
			if(m1.get("max")>=m2.get("max")){
				map.put("max", m1.get("max"));
			}
			else{
				map.put("max", m2.get("max"));
			}
			return map;
		}
//		return 0;
		
	}
	
	
	public static void main(String args[]){
		int[] a={5,1,2,6,7,3,9,9};
		Map<String,Integer> map=minmax(a,0,5);
		System.out.println(map.get("min"));
		System.out.println(map.get("max"));
		
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值