一.需求
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
示例3:
输入:x = 2147395599
输出:46339
提示:
- 0 <= x <= 231 - 1
二.思路图
这里用二分查找法的图解
三.代码
测试方法
/**
* 入口
* 69. x 的平方根
* 输入:
* int x = 18;
* 输出:
* result1 = 4
* result2 = 4
* result3 = 4
* result4 = 4
* 解释:
* 编写计算平方根的方案
* 牛顿迭代法只是无尽趋近,并非完整的平方根计算方案
* 二分查找法并非最优解法,但可以使用
* 日常中直接调用平方根函数
* 我写的暴力算法,很菜,没想到如何进一步优化,看来还得多看看
*/
@Test
public void suanfa15()
{
// 声明参数
int x = 18;
// 最简易的方案,直接调用平方根函数
int result1 = mySqrt(x);
System.out.println("result1 = " + result1);
// 牛顿迭代法
int result2 = mySqrtNewtonIterationMethod(x);
System.out.println("result2 = " + result2);
// 二分查找法
int result3 = mySqrtBinarySearchTree(x);
System.out.println("result3 = " + result3);
// 我自己写的暴力算法(都很慢)
int result4 = mySqrtWzw(x);
System.out.println("result4 = " + result4);
}
函数方案
/**
* 69. x 的平方根
* 最简易的方案,直接调用平方根函数
*
* @param x
* @return
*/
public int mySqrt(int x)
{
return (int) Math.sqrt(x);
}
牛顿迭代法
/**
* 69. x 的平方根
* 牛顿迭代法
*
* @param x
* @return
*/
public int mySqrtNewtonIterationMethod(int x)
{
long a = x;
while (a * a > x)
{
a = (a + x / a) / 2;
}
return (int)a;
}
二分查找法
/**
* 69. x 的平方根
* 二分查找法
*
* @param x
* @return
*/
public int mySqrtBinarySearchTree(int x) {
// 特殊值判断
if (x == 0) {
return 0;
}
if (x == 1) {
return 1;
}
int left = 1;
int right = x / 2;
// 在区间 [left..right] 查找目标元素
while (left < right) {
int mid = left + (right - left + 1) / 2;
// 注意:这里为了避免乘法溢出,改用除法
if (mid > x / mid) {
// 下一轮搜索区间是 [left..mid - 1]
right = mid - 1;
} else {
// 下一轮搜索区间是 [mid..right]
left = mid;
}
}
return left;
}
自己写的算法
/**
* 69. x 的平方根
* 我自己写的暴力算法(都很慢)
*
* @param x
* @return
*/
public int mySqrtWzw(int x) {
double a = 0;
//
while(true)
{
double b = a * a;
if ( b == x)
{
return (int) a;
}
else if(b > x)
{
return (int) (a-1);
}
else
{
a++;
}
}
}
作者:王子威
四.总结
- 学习了 x 的平方根算法
- 编写计算平方根的方案
- 牛顿迭代法只是无尽趋近,并非完整的平方根计算方案
- 二分查找法并非最优解法,但可以使用
- 日常中直接调用平方根函数
- 我写的暴力算法,很菜,没想到如何进一步优化,看来还得多看看
- 算法兴趣+1 总:15
- 加强了对算法的分析能力