69. Sqrt(x)
阿新 • • 發佈:2017-07-20
rar 更新 .com 鏈接 roo solution mysq 總結 and
while(r>l){mid=(l+r)/2。。。} return l;
然後更新是不符合條件l=mid+1,否則是r=mid
反之,即 題目屬於"二分值越小越符合條件",即要求符合條件的最大值,那就是
while(r>l){mid=(l+r+1)/2。。。} return r;
然後更新是符合條件l=mid,否則是r=mid-1
至於為啥?→_→其實只要試試r-l=1的例子
upd:又想起一坑{其實是看到有人寫了},如果涉及負數,最好用mid=l+(r-l)/2代替第1類,mid=l+(r-l+1)/2代替第2類
鏈接:https://www.zhihu.com/question/36132386/answer/66071801
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
Implement int sqrt(int x)
.
Compute and return the square root of x.
二分可解
這裏是關於二分的一些總結:
首先,如果題目屬於"二分值越大越符合條件",即要求符合條件的最小值,那就是while(r>l){mid=(l+r)/2。。。} return l;
然後更新是不符合條件l=mid+1,否則是r=mid
反之,即 題目屬於"二分值越小越符合條件",即要求符合條件的最大值,那就是
while(r>l){mid=(l+r+1)/2。。。} return r;
然後更新是符合條件l=mid,否則是r=mid-1
至於為啥?→_→其實只要試試r-l=1的例子
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
class Solution { public: int mySqrt(int x) { long long l = 0, r = x,mid; if (x < 2) return x; while(l < r) { mid = l + (r - l + 1) / 2; if (mid > x/mid) r = mid - 1; else if (mid < x/mid) l = mid; else return mid; } return r; } };
69. Sqrt(x)