求最大公约数,二分查找法

最近买了两本有关数据结构和算法的书来研,打算好好重新学习一下,毕竟技术随着时间的推移是可能被慢慢淘汰的,而算法是那些技术实现的根基。

算法是是计算机解决问题的方法,高效的算法能让计算机更快的解决问题。



欧几里得算法求最大公约数:

计算两个非负整数p、q的最大公约数:如果q=0,则最大公约数是p,否则,将p除以q,得到余数r,p、q的最大公约数等于p与r的最大公约数。
因此,我们通过计算机代码来实现:
/**欧几里得算法,求最大公约数
 * 求两个非负整数的最大公约数
 * @param num1
 * @param num2
 * @return
 */
public static int gcd(int num1,int num2){
	if(num2 == 0){
		return num1;
	}
	int r = num1 % num2;
        return gcd(num1, r);
}

二分查找法:
当我们要在一个有序的序列中找到一个数,我们可以通过二分查找法,这样可以有效减少查询次数。
,如果我们只是通过一个个遍历来查找,这样效率就会下降很多。

图解:


/**
	 * 二分法求下标 ,要求数组是有序的
	 * @param key
	 * @param numbers
	 * @return
	 */
	public static int getIndex(int key,int[] numbers){
		int startIndex = 0;
		int endIndex = numbers.length - 1;
		while(startIndex <= endIndex){
			int midIndex = (startIndex + endIndex)/2;
			if(key > numbers[midIndex]){
				startIndex = midIndex + 1;
			}else if(key < numbers[midIndex]){
				endIndex = midIndex - 1;
			}else{
				return midIndex;
			}
		}
		return -1;
	}
	
	/**
	 * 低效率的实现
	 * @param key
	 * @param numbers
	 * @return
	 */
	public int getIndexLow(int key,int[] numbers){
		for(int i = 0;i < numbers.length;i++){
			if(key == numbers[i]){
				return i;
			}
		}
		return -1;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值