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