三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

69.x的平方根

69.x的平方根

给你一个非负整数x,计算并返回x算术平方根

由于返回类型是整数,结果只保留整数部分,小数部分将被舍去 。

注意:不允许使用任何内置指数函数和算符,例如pow(x, 0.5)或者x ** 0.5

代码语法:1LL表示一个long long类型的整数1;

它的作用是:强制让后面的乘法按照 long long 来计算

如果写:

long long square=middle*middle;

虽然左边是long long,但是右边的middle*middle

可能会先用int计算,计算过程中就已经溢出了,然后再赋值给long long,已经晚了。

所以写:

1LL*middle*middle

可以保证整个乘法从一开始就是long long运算。

题目的本质,找到一个整数ans:

1.ans*ans<=x;

2.(ans+1)*(ans+1)>x;

所以我们可以在[0, x]这个范围里,用二分查找找到最大的num,使得:

num*num<=x;

然后分为三个条件判断,跟二分法一样

有一个要点是最后返回的是right,这个就是我们前面说的要满足最大的ans*ans<=x;

结束循环时候此时left>right

right停在最后一个满足right*right<=x


class Solution { public: int mySqrt(int x) { int left=0; int right=x; while(left<=right){ int middle=left+(right-left)/2; long long square=1LL * middle *middle; if(square==x) return middle; else if(square<x) left=middle+1; else right=middle-1; } return right; } };
← 返回列表