/** * 问题描述:一个袋子有一堆硬币其中一枚是假币,并且假币和真币一模一样,肉眼很难分辨,目前只知道假币比真币重量轻一点,请问如何区分出假币呢? */ 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)); }
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦