【LeetCode】69. Sqrt(x)解法及注释
2016-04-08 23:28
661 查看
69. Sqrt(x)
Implement
Compute and return the square root of x.
【分析】
对于一个正整数x,我们知道它的平方根不可能超过x/2,因此,基于此思路我们可以遍历[0 x/2]之间的所有正整数,将它们呢的平方与x比较,如果相等或者大于前者小于后者,即找到x的平方根(整数部分),但是这种方法会超时,不是理想的解法,而是“暴力”解法。
“二分法”,类似二分查找,我们设置上下限low=1,high=x,mid=(low+high)/2,在[1 x]区间进行折半查找,可以在log(2n)的时间复杂度解决问题,但是,一定要注意一个细节,当我们判断mid是否为x的平方根时要注意防止溢出(亲测会溢出!比如x=INT_MAX),用除法代替乘法:x/mid>=mid&&x/(mid+1)<(mid+1),避免mid*mid>=x&&(mid+1)*(mid+1)<x
【解法及注释】
Implement
int sqrt(int x).
Compute and return the square root of x.
【分析】
对于一个正整数x,我们知道它的平方根不可能超过x/2,因此,基于此思路我们可以遍历[0 x/2]之间的所有正整数,将它们呢的平方与x比较,如果相等或者大于前者小于后者,即找到x的平方根(整数部分),但是这种方法会超时,不是理想的解法,而是“暴力”解法。
“二分法”,类似二分查找,我们设置上下限low=1,high=x,mid=(low+high)/2,在[1 x]区间进行折半查找,可以在log(2n)的时间复杂度解决问题,但是,一定要注意一个细节,当我们判断mid是否为x的平方根时要注意防止溢出(亲测会溢出!比如x=INT_MAX),用除法代替乘法:x/mid>=mid&&x/(mid+1)<(mid+1),避免mid*mid>=x&&(mid+1)*(mid+1)<x
【解法及注释】
class Solution { public: int mySqrt(int x) { //特殊情况处理 if(x<0)return -1; if(x==0) return 0; //用二分法 int low=1; int high=x; int mid; while(low<=high) { mid=(low+high)/2; if(x/mid>=mid&&x/(mid+1)<mid+1)return mid;//防止溢出 else if(x/mid>mid) { low=mid+1; } else { high=mid-1; } } return -1; } };
相关文章推荐
- MySQL系列(1)--面试常用的
- iOS之UIColloctionView
- POJ 2914 Minimum Cut 全局最小割
- android的一道面试题
- 解决问题的细微方法
- javascript中replace与正则表达式
- 搭建公司内部的NuGet Server
- 在阿里云中编译Linux4.5.0内核 - Ubuntu内核编译教程
- 刚刚注册的博客
- forward和redirect 的区别
- hdu 1078 FatMouse and Cheese(dfs)
- arpack编译64位版本的记录
- JAVA 对象引用,以及对象赋值(转载)
- 互联网产品各阶段的标准流程文档
- Java笔记
- 2010上交:计算表达式
- Python3爬虫之爬取某一路径的所有html文件
- web框架--flask
- 用 Express4 写一个简单的留言板
- 剑指Offer--004-替换空格