分治演算法

post200發表於2021-09-09
/**
 * 問題描述:一個袋子有一堆硬幣其中一枚是假幣,並且假幣和真幣一模一樣,肉眼很難分辨,目前只知道假幣比真幣重量輕一點,請問如何區分出假幣呢?
 */
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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2249/viewspace-2816607/,如需轉載,請註明出處,否則將追究法律責任。

相關文章