为了账号安全,请及时绑定邮箱和手机立即绑定

分治算法

标签:
Android
/**
 * 问题描述:一个袋子有一堆硬币其中一枚是假币,并且假币和真币一模一样,肉眼很难分辨,目前只知道假币比真币重量轻一点,请问如何区分出假币呢?
 */
static int FastCoin(int[] coin, int low , int high){
int num1,num2;//num1求出前半部分的总和,num2求出后半部分的总和
int re = 0;//记录最小值得位置
num1 = num2 = 0;
//*******************************下面的判断是递归的终止条件
if(low + 1 == high){//当索引low和high相邻,就是两者中的一个
if(coin[low] > coin[high]){
re = high + 1;//这里coin数组是从0开始所以要+1,下面同理
return re;
}else if(coin[low] < coin[high]){
re = low + 1;
return re;
}else{}//当相等的时候就说明此数组中的元素都一样
}
//*******************************coin数量为偶数
if((high - low + 1)%2 == 0){//coin的数量为偶数
for(int i = low; i<=low+(high - low)/2; i++){//前半部分
num1 = num1 + coin[i];
}
for(int i = low + (high - low)/2 + 1; i<=high ; i++){//后半部分
num2 = num2 + coin[i];
}
//进行判断
if(num1 > num2){//可知最小值在后半部分
re = FastCoin(coin, low+(high - low)/2+1,high);
return re;
}else if(num1 < num2){//可知最小值在前半部分
re = FastCoin(coin, low, low+(high - low)/2);
return re;
}else{}//如果相等则说明没有小值
//*******************************coin的数量为奇数
}else{//coin的数量为奇数
for(int i = low; i<=low+(high-low)/2-1; i++){//前半部分
num1 = num1 + coin[i];
}
for(int i = low+(high-low)/2+1; i<=high; i++){//后半部分
num2 = num2 + coin[i];
}
if(num1 > num2){//可知最小值在后半部分
re = FastCoin(coin, low+(high-low)/2+1, high);
return re;
}else if(num1 < num2){//可知在前半部分
re = FastCoin(coin, low, low+(high-low)/2-1);
return re;
}else{
re = low+(high-low)/2+1;
return re;
}
}
return re;
}
public static void main(String[] args) {
int[] coin = new int[]{3,3,3,3,3,2,3,3,3,3};
System.out.println(FastCoin(coin, 0, 9));
}

原文链接:http://www.apkbus.com/blog-523232-59351.html

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消