LeetCode 69[x的平方根]
题目
链接
详情
实例
提示
题解
思路一[暴力法]
由于所求的是整型且是正符号整型,可以采取循环遍历的方式来求取平方根
用 for 循环将 i 由 0 开始遍历,求平方值
当平方值小于指定值,此时循环继续
直到以下两种情况时退出循环:
- 当平方值为指定值时,返回 i
- 当平方值大于指定值时,返回 i - 1
当 i 为有符号整型时,其遍历到 46341 时,平方值为 2147488281 ,但是力扣官方的 int 值的范围最大值为 2147483647,故其会溢出,所以 i 应该设置为 unsigned int 型
代码一
思路二[二分法]
问题转换一下,给定一个数,在范围内找到该数,其实就是查找问题,此处可采用二分查找
初始值设定最小值 iMin 为 0,最大值 iMax 为给定值 x
开始循环:
求取中间值 iMid = (iMin + iMax) / 2
取中间值的平方 x1= iMid * iMid
若 x1 等于 x,则平方根为 iMid ,退出循环
若 x1 > x,即 iMid > sqrt(x),即所求值小于 iMid,需要在 iMin 到 iMid -1 范围中查找,即 iMax = iMid - 1
若 x1< x,即 iMid < sqrt(x),即所求值大于 iMid,需要在 iMid + 1 到 iMax 范围中查找,即 iMin = iMid + 1
继续执行循环,直到 iMin > iMax,退出循环
在此处需要注意,由于该题平方根是取整的,所以有可能是找不着整数平方根的,需要在判断的时候另外加一个条件:
如果中间值的平方 x,即 x > x1,则取中间值加1的值的平方值 x2,即判断一下 x2 是否大于 x:如果大于,则平方根取整为 iMid,否则啊,继续循环
也就是啊,x1 < x < x2,也就是 sqrt(x1) < sqrt(x) < sqrt(x2),即 iMid < sqrt(x) < iMid + 1,所以啊,取整之后的值就是 iMid,此时相当于是找到了平方根了,就退出循环了
代码二
类似题目
类似题解
本文来自博客园,作者:EricsT,转载请注明原文链接:https://www.cnblogs.com/EricsT/p/18543510