继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

分治算法

饮歌长啸
关注TA
已关注
手记 188
粉丝 46
获赞 152
/**
 * 问题描述:一个袋子有一堆硬币其中一枚是假币,并且假币和真币一模一样,肉眼很难分辨,目前只知道假币比真币重量轻一点,请问如何区分出假币呢?
 */
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

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP