分金块问题

问题描述

有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式除非有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇员所得到的金块重。如果有新的金块周期性的加入袋中,则每个月都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最轻和最重的金块 。



方法

能采用的方法有蛮力法,二分法(分治法)等。一般情况下,选择二分法较为快速,但内存消耗较大。



蛮力法算法

Step1 将所有金块重量存于数组
Step2 将第一个金块同时标记为最重和最轻的金块
Step3 将第一个与后一个进行重量的比较,将更重的标记为max,同时如果现阶段最轻的比后者轻,那么将后者标记为min。

Step4 依次进行比较,最重得到最重的和最轻的max min.
public float[] MaxMin(float[] ary){
		float MM[] = new float[2];
		MM[0] = MM[1] = ary[0];
		for ( int i = 1; i < ary.length - 1; i++ ) {
			if(ary[i]>MM[0]){
				MM[0] = ary[i];
			}else if(ary[i]<MM[1]){
				MM[1] = ary[i];
			}
		}
		return MM;
}


二分法算法

问题抽象、简化为:在n个元素的集合中寻找最大和最小值元素。

(1)将集合一分为二,变为两个集合,目的是在较小的两个集合中分别找最大、最小元素。

(2)递归分解较小集合,直到每个集合中的元素个数≤2,然后找出小集合的最大、最小元素。

(3)合并(回溯):自低向上把子问题的解合并,大元素中取最大者,小元素中取最小者,最后得到元问题的解。



参考

http://3y.uu456.com/bp_0gi063s9b06cyp27mpar_1.html

http://www.doc88.com/p-956216846019.html    

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值