1.1.3 数组——x的平方(Leetcode 69)
生活随笔
收集整理的這篇文章主要介紹了
1.1.3 数组——x的平方(Leetcode 69)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
x的平方
- 1. 題目
- 2. 思路
- 3. 代碼實現
- 4. 總結
1. 題目
leetcode鏈接
給你一個非負整數 x ,計算并返回 x 的 算術平方根 。
由于返回類型是整數,結果只保留 整數部分 ,小數部分將被 舍去 。
注意:不允許使用任何內置指數函數和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
輸入:x = 4
輸出:2
示例 2:
輸入:x = 8
輸出:2
解釋:8 的算術平方根是 2.82842…, 由于返回類型是整數,小數部分將被舍去。
提示:
0 <= x <= 231 - 1
2. 思路
因為只保留整數部分,所以ans 是滿足 k2 ≤ x 的最大 k 值
解法一:對數函數求平方根
【注意:返回值為浮點數,會產生精度問題】
解法二:二分法搜索k
解法三:牛頓迭代法
3. 代碼實現
解法二:二分法搜索k
class Solution { public:int mySqrt(int x) {int left = 0;int right = x;int ans = -1;while(left <= right){int middle = left + (right - left) / 2;if((long long)middle*middle <= x){ans = middle; // 滿足條件的k, 最后更新得到ansleft = middle + 1;}else{right = middle - 1;}}return ans;}};復雜度分析
- 時間復雜度:O(logx)O(logx)O(logx),即為二分查找需要的次數。
- 空間復雜度:O(1)O(1)O(1)
解法三:牛頓迭代法
class Solution { public:int mySqrt(int x) {if (x == 0) return 0;// 設置迭代初始值double x0 = x;double C = x;while(true){double x1 = 0.5 * (x0 + C/x0); // 根據公式得到下一個點x(i+1)if(fabs(x1 - x0) < 1e-7) break;x0 = x1; // 更新點xi}return int(x0);}};復雜度分析
- 時間復雜度:O(logx)O(logx)O(logx),此方法是二次收斂的,相較于二分查找更快。
- 空間復雜度:O(1)O(1)O(1)。
4. 總結
1. 溢出判斷
(long long)middle*middle <= x- 這里middle的取值范圍為0 <= middle <= 231 - 1,則0 <= middle * middle < 262
- 而int型變量的取值范圍為231 <= middle <= 231
- 因為需要將變量類型轉換為long
2. 已知直線斜率和直線上一點,直線方程的表達公式
3. abs()與fabs()
- abs( )主要用于對求整數的絕對值,在“stdlib.h”(或 )頭文件里面。
- 而fabs( )主要是求精度要求更高的double ,float 型的絕對值,在< cmath>頭文件里。
- 兩者在只#include< cmath>時都可以使用。
4. 訂正數學習慣寫法
double x1 = 1/2 * (x0 + C/x0); // 根據公式得到下一個點x(i+1)寫成這種形式會一直循環下去,因為這里的1/2會得到0!
總結
以上是生活随笔為你收集整理的1.1.3 数组——x的平方(Leetcode 69)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDM下载器的安装与使用
- 下一篇: mysql数据库有string_mysq