题目描述
Implement int sqrt(int x).
Compute and return the square root of x, where x is guaranteed to be a non-negative integer.
Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.
给一个非负整数,对其开方,并返回其整数部分。
举个例子:
Example 1:
Input: 4
Output: 2
Example 2:
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since
the decimal part is truncated, 2 is returned.
Update at 2020_0716
拿这道题总结一下Y总
的二分板子~
先来看下示意图:
二分的实质在于根据某个性质,将区间一分为二。
那么会有两种情况,第一种目标值在左
边,也就是红色
点,
它代表的含义是指,满足该性质的点在左边,而右边没有,对应模板:
int bsearch_left(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
注意有个+1
喔,避免向下取整
导致死循环。
那么第二种情况就是满足性质的值在右
边,也就是蓝色
点,对于模板如下:
int bsearch_right(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
再来看下这道题,由于它的去除小数部分,那么就是找左边的值,用左模板即可。
分别来看下两种情况:
- 左模板
- 右模板
class Solution {
public int mySqrt(int x) {
int l = 0, r = x;
while (l < r){
int mid = l + r + 1 >> 1;
if (mid <= x / mid) l = mid;
else r = mid - 1;
}
return l;
}
}