由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 大牛看看为撒这个sqrt binary search过不了OJ
相关主题
请问给一个整数,如何返回他的平方根?求助各位大牛:LeetCode的Decode Ways
leetcode 关于Partition ListFind Median Of Two Sorted Arrays
求助:3sum总是运行不过lc新题,贴个刚写的solution
请教下3sum为撒超时请教怎么实现sqrt?
how to check a bin tree is balanced?Google 面试
问一个关于binary search的问题脸书电话面试第一轮代码题面筋
听说binary search程序非常难写对,是吗?square root的算法
how to calculate sqrt double?Zygna实习面经+求offer建议
相关话题的讨论汇总
话题: int话题: else话题: return话题: sqrt话题: solution
进入JobHunting版参与讨论
1 (共1页)
c**z
发帖数: 669
1
class Solution {
public:
int sqrt(int x) {
int l = 0;
int r = x;

while( l<=r)
{
int m = l + (r-l)/2;
if ( m*m == x) return m;

else if ( m*m > x)
{
r = m -1;
}
else
{
l = m + 1;
}
}

return -1;
}
};
e***m
发帖数: 92
2
你的循环中如果r=l+1,某些情况下会出现死循环

【在 c**z 的大作中提到】
: class Solution {
: public:
: int sqrt(int x) {
: int l = 0;
: int r = x;
:
: while( l<=r)
: {
: int m = l + (r-l)/2;
: if ( m*m == x) return m;

b******g
发帖数: 3616
3
非大牛,也在刷题。
看了你的code发现两个问题:
第一是溢出问题:当x很大时,你的第一轮m*m = x^2/4,很可能就已经溢出了。我想这
是造成为什么会time limit exceeded的原因。将乘法比较改为x/m的除法比较就可以避
免这个问题。
第二个问题:我的理解是这题求的是一个近似平方根,也就是sqrt(17)应该给出的答案
是4.但你的程序似乎对非完全平方数都会返回-1
l*****a
发帖数: 14598
4
int lo=0;
int hi=x;
int res=-1;
while(lo<=hi) {
int mid=lo+(hi-lo)/2;
if(mid==x/mid) return mid;
if(mid>x/mid) hi=mid-1;
else {
res=mid;
lo=mid+1;
}
}
return res;

【在 c**z 的大作中提到】
: class Solution {
: public:
: int sqrt(int x) {
: int l = 0;
: int r = x;
:
: while( l<=r)
: {
: int m = l + (r-l)/2;
: if ( m*m == x) return m;

v****a
发帖数: 236
5
LS说得对。
也可以用double 作为中间结果,就不用判断溢出了。
double diff = 0.01;
double m = (low + high) / 2;
if(Math.abs(m*m - x) < diff)
{
return (int)m;
}
else
{
... 二分查找, 注意考虑diff
}
b******g
发帖数: 3616
6
这题我觉得用除法做的时候有个corner case,就是当x为1时, 第一次while循环时mid
就变成0,这样x/mid就有问题了。所以应该要加上一个额外判断。

【在 l*****a 的大作中提到】
: int lo=0;
: int hi=x;
: int res=-1;
: while(lo<=hi) {
: int mid=lo+(hi-lo)/2;
: if(mid==x/mid) return mid;
: if(mid>x/mid) hi=mid-1;
: else {
: res=mid;
: lo=mid+1;

l*****a
发帖数: 14598
7
嗯,可以先判,0

mid

【在 b******g 的大作中提到】
: 这题我觉得用除法做的时候有个corner case,就是当x为1时, 第一次while循环时mid
: 就变成0,这样x/mid就有问题了。所以应该要加上一个额外判断。

r****7
发帖数: 2282
8
x = 1就过不去啊
如果不是完全平方数就返回-1,把while换成 l < r
如果是返回最近的那个,m*m == x换成 +/-1分别大于和小于x

【在 c**z 的大作中提到】
: class Solution {
: public:
: int sqrt(int x) {
: int l = 0;
: int r = x;
:
: while( l<=r)
: {
: int m = l + (r-l)/2;
: if ( m*m == x) return m;

1 (共1页)
进入JobHunting版参与讨论
相关主题
Zygna实习面经+求offer建议how to check a bin tree is balanced?
几个面试的数学题问一个关于binary search的问题
请教如何解决整数的溢出问题听说binary search程序非常难写对,是吗?
C++ Q23: if if elsehow to calculate sqrt double?
请问给一个整数,如何返回他的平方根?求助各位大牛:LeetCode的Decode Ways
leetcode 关于Partition ListFind Median Of Two Sorted Arrays
求助:3sum总是运行不过lc新题,贴个刚写的solution
请教下3sum为撒超时请教怎么实现sqrt?
相关话题的讨论汇总
话题: int话题: else话题: return话题: sqrt话题: solution