69. Sqrt(x)
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的例子
upd:又想起一坑{其实是看到有人写了},如果涉及负数,最好用mid=l+(r-l)/2代替第1类,mid=l+(r-l+1)/2代替第2类
链接:https://www.zhihu.com/question/36132386/answer/66071801while(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类
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
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; } };
原文地址:http://www.cnblogs.com/pk28/
与有肝胆人共事,从无字句处读书。
欢迎关注公众号:
欢迎关注公众号:
