时间复杂度:O(log n)
解题思路
其实就是暴力解法,只不过利用了二分查找的思想,目标是找到最大的最接近于平方根的数字。先设置查找区间为[0,x],然后计算出mid值,再比较mid的平方和x的大小。如果mid平方小于等于x就更新一下res,说明找到了更大的更接近的平方根,并且更新right为mid-1;如果mid平方大于x就说明该x过大,更新left为mid+1。直至left>right。
AC代码
func mySqrt(x int) int {
res:=0
left,right:=0,x
for left<=right{
mid:=left+(right-left)>>1
if mid*mid<=x{
res=mid
left=mid+1
}else{
right=mid-1
}
}
return res
}
感悟
起初以为是一道数学题,会有什么公式求出平方根,后来一想应该可以通过暴力方法试出答案,看了题解才想到可以利用二分查找将时间复杂度缩减为log n。