HappyLeetcode64:Sqrt(x)
生活随笔
收集整理的這篇文章主要介紹了
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业级应用架构(一) 三层架构之解耦
- 下一篇: atitit.提升开发效率---mda