快速查找算术平方根
首先透過例題分析問題:
給你一個非負(fù)整數(shù) x ,計算并返回 x 的 算術(shù)平方根 。
由于返回類型是整數(shù),結(jié)果只保留 整數(shù)部分 ,小數(shù)部分將被 舍去 。
注意:不允許使用任何內(nèi)置指數(shù)函數(shù)和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
輸入:x = 16
輸出:4
示例 2:
輸入:x = 7
輸出:2
解釋:7?的算術(shù)平方根是 2.645751..., 由于返回類型是整數(shù),小數(shù)部分將被舍去。
?
提示:
0 <= x <=2^31 - 1
分析題目:
目標(biāo):算術(shù)平方根的整數(shù)部分
取值范圍:x∈N 且 x <= 2^31 - 1?
解題思路:
我采用數(shù)學(xué)中求解算術(shù)平方根方法
當(dāng)一個數(shù) x 存在算數(shù)平方根時a^2 <b^2 ,且b-a = 1
解題方法:
通過兩個點的中位數(shù)的平方與x進行比較尋找平方根的逼進值,當(dāng)兩個點第距離小于1的時候則可以停止查找,輸出在平方根左側(cè)的點,圖例:
?
當(dāng)((max+min)/2)的平方小于 x 時則 √x 在((max+min)/2)的右側(cè),反之則在左側(cè)。圖例:
以此類推,最終當(dāng) max-min < 1 時,即可得到 x 的算數(shù)平方根的整數(shù)部分。
?
解題假設(shè):
由開平方的性質(zhì)可知0 <=?√x <= x
所以 min 取 0 ,max 取 x。
特例:當(dāng)x為 0、1時,√x=x
當(dāng) x=0 時:(max+min)/2 =0 按照上述方法已讓可以解出√0=0
當(dāng) x=1 時:(max+min)/2 =0 按上述方法得到的結(jié)果為0≠1,則需要去除特殊的點
解題:
此處設(shè)中點 (max+min)/2 為 c方便閱讀程序,
min、max、c均取長整型(long)防止c去平方時溢出
public int mySqrt(int x) {long min=0;long max=x;if(x==1){return 1;}while((max-min)>1 ) {long c=(min + max) / 2;if (c*c > x) {max = c;} else {min = c;}}return (int) min; }測試程序:(先將 mySqrt() 聲明為 static ,方便main方法直接調(diào)用)
測試? x=0
測試 x=1
測試 x=?2147395599
(此處就不做過多測試,可以自己試試其他數(shù))
此方法采用二分法思想,時間復(fù)雜度O(log2n)。
?
?
?
總結(jié)
- 上一篇: 美式橄榄球(NFL)基本规则
- 下一篇: 安卓机顶盒安装软件教程