题目:
x的平方根 在不使用 sqrt(x)函数的情况下,得到x的平方根的整数部分 重点考察:二分法、牛顿迭代
思路1:二分查找法
暴力算法的优化,对于求根号x,我们可以对1到x-1的所有数,进行循环求解。但是那样效率太低,因此我们进行二分法求解
public class sqrt { /* 思路:二分法解决思路==暴力算法 1.定义两个指针,left=0,right=x,index=-1 2.当left<=right时,进行循环,每次循环 3.当mid*mid<=x时,index=mid,left=mid+1,否则right=mid-1 4.循环结束后,返回index */ public static int dichotomy(int x){ int left = 0,right = x ,index = -1; while (left<=right){ int mid = left+(right-left)/2; if(mid*mid<=x){ index = mid; left = mid+1; }else{ right = mid-1; } } return index; }
思路2:牛顿迭代法
牛顿迭代法的思想
比如x=n*n,x/n=n,我们想求出最终应该是x/n=n,我们可以举例发现x/n的平方,或者n的平方,都没有(i+x/i)/2接近根号x,因此我们可以用这种方式来进行递归,找出最终值 这就是牛顿迭代思路,具体的可以参考微积分
/* 思路:牛顿迭代法 1.定义一个函数sqrt,参数为x和i,返回值为double 2.定义一个变量res,初始值为(i+x/i)/2,如果res==i,则返回i,否则继续迭代 3.如果res!=i,则继续迭代,直到res==i,返回i 牛顿迭代法思路,比如x=n*n,x/n=n,我们想求出最终应该是x/n=n,我们可以举例发现x/n的平方,或者n的平方,都没有(i+x/i)/2接近根号x,因此我们可以用这种方式来进行递归,找出最终值 这就是牛顿迭代思路,具体的可以参考微积分 */ public static int newtonIteration(int x){ if(x==0){ return 0; } return (int)sqrt(x,x); } public static double sqrt(double i, int x){ double res = (i+x/i)/2; if(res == i){ return i; }else{ return sqrt(res,x); } }
完整实现
package leetcode30; /* x的平方根 在不使用 sqrt(x)函数的情况下,得到x的平方根的整数部分 重点考察:二分法、牛顿迭代 */ public class sqrt { /* 思路:二分法解决思路==暴力算法 1.定义两个指针,left=0,right=x,index=-1 2.当left<=right时,进行循环,每次循环 3.当mid*mid<=x时,index=mid,left=mid+1,否则right=mid-1 4.循环结束后,返回index */ public static int dichotomy(int x){ int left = 0,right = x ,index = -1; while (left<=right){ int mid = left+(right-left)/2; if(mid*mid<=x){ index = mid; left = mid+1; }else{ right = mid-1; } } return index; } /* 思路:牛顿迭代法 1.定义一个函数sqrt,参数为x和i,返回值为double 2.定义一个变量res,初始值为(i+x/i)/2,如果res==i,则返回i,否则继续迭代 3.如果res!=i,则继续迭代,直到res==i,返回i 牛顿迭代法思路,比如x=n*n,x/n=n,我们想求出最终应该是x/n=n,我们可以举例发现x/n的平方,或者n的平方,都没有(i+x/i)/2接近根号x,因此我们可以用这种方式来进行递归,找出最终值 这就是牛顿迭代思路,具体的可以参考微积分 */ public static int newtonIteration(int x){ if(x==0){ return 0; } return (int)sqrt(x,x); } public static double sqrt(double i, int x){ double res = (i+x/i)/2; if(res == i){ return i; }else{ return sqrt(res,x); } } public static void main(String[] args) { System.out.println(dichotomy(25)); System.out.println(newtonIteration(25)); } }