題目
連結
LeetCode LCR072[x的平方根]
詳情
例項
提示
題解
思路一[暴力法]
由於所求的是整型且是正符號整型,可以採取迴圈遍歷的方式來求取平方根
用 for 迴圈將 i 由 0 開始遍歷
迴圈體:求 i 的平方值
當平方值小於指定值,此時迴圈繼續
退出迴圈的條件:
- 當平方值為指定值時,返回 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
在此處需要注意,由於該題平方根是取整的,所以有可能是找不著整數平方根的,需要在判斷的時候另外加一個條件:
如果中間值的平方 x,即 x > x1,則取中間值加1的值的平方根 x2,即判斷一下 x2 是否大於 x:如果大於,則平方根取整為 iMid,否則啊,繼續迴圈
也就是啊,x1 < x < x2,也就是 sqrt(x1) < sqrt(x) < sqrt(x2),即 iMid < sqrt(x) < iMid + 1,所以啊,取整之後的值就是 iMid,此時相當於是找到了平方根了,就退出迴圈了
繼續執行迴圈,直到 iMin > iMax,退出迴圈
程式碼二
類似題目
LeetCode 367[有效的完全平方數] 題目
LeetCode 69[x的平方根] 題目
類似題解
LeetCode 367[有效的完全平方數] 題解
LeetCode 69[x的平方根] 題解