日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HappyLeetcode64:Sqrt(x)

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HappyLeetcode64:Sqrt(x) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Implement int sqrt(int x).

這道題本質上是求sqrt(x)下最大的整數。二分查找是比較容易想到的方法。另,在網上又學習了下別人的牛頓迭代法。

這是我原來的寫法,寫入是錯誤的,復雜度太高

class Solution { public:int sqrt(int x) {if (x <= 0)return 0;if (x == 0 || x == 1)return x;long long start = 1;long long end = x >> 1;int index = start;while (start <= end){index = (start + end) >> 1;if (index*index == x)return index;else{if (end*end <= x)return end;if (end - start == 1)return start;if (index*index > x)end = index - 1;if (index*index < x)start = index ;}}return index;} };

其實二分查找的思想是對的,只不過在某些小細節上海需要尤為注意一下。

標準代碼可以這么寫:

class Solution { public:int sqrt(int x) {long long i = 0;long long j = x / 2 + 1;while (i <= j){long long mid = (i + j) / 2;long long sq = mid * mid;if (sq == x)return mid;else if (sq < x)i = mid + 1;elsej = mid - 1;}return j;} };

完美的考慮了溢出的問題。這是我應該好好學習的地方。

牛頓迭代發解題

有此方法,可得到迭代公式xi+1=xi - (xi2 - n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2。

于是有如下代碼:

int sqrt(int x) {if (x == 0) return 0;double last = 0;double res = 1;while (res != last){last = res;res = (res + x / res) / 2;}return int(res); }

求解double的題目,可參考如上代碼

double sqrt(double x) {if (x == 0) return 0;double last = 0.0;double res = 1.0;while (!euqal(res,last)){last = res;res = (res + x / res) / 2;}return res; }bool euqal(double num1, double num2) {if ((num1 - num2) < 0.0000001 && (num1 - num2) > -0.0000001)return true;elsereturn false; }

參考:

http://www.cnblogs.com/AnnieKim/archive/2013/04/18/3028607.html

轉載于:https://www.cnblogs.com/chengxuyuanxiaowang/p/4349933.html

總結

以上是生活随笔為你收集整理的HappyLeetcode64:Sqrt(x)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。