每周都有几道算法题啦。
第一周
是分治算法一道比较经典的例题,题目如下:有16个硬币的袋子。16个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。我们要找出这个伪造的硬币。我们有一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。
如果数目较少,我们可以采用逐个比较的方法,寻找出假币的位置。但这是算法题啊喂,暴力解题算个什么鬼2333,还是采用分治的方法解决。
分治算法在我的理解内,就是将比较大的问题分成比较小的,相互独立的子问题,即N=n+n+……+n,采用递归方法解决。emmmm,还要继续看书。
public class FakeCoins {
public static void main(String args[]) {
int[] coins = new int[]{2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2};
int index = fakeCoins(coins, 0, 15) + 1;
//System.out.println(index);
System.out.println("16枚硬币中第" + index + "枚是假币");
}
public static int fakeCoins(int[] coins,int low,int high){
int sum1 = 0,sum2 = 0,re = 0;
if((high-low+1) % 2 == 0){ //如果总个数为偶数