题目
思路
这道题实际上是一个查找问题,因此很快想到了二分法。
这里回顾一下二分法,二分查找法的条件是元素必须是有序的,如果是无序的则要先进行排序操作。
它的时间复杂度最坏情况下是在排除到只剩下最后一个值之后得到结果
也就是设有n个数,二分了x次后,剩下1个数,列方程为
n
∗
(
1
2
)
x
=
1
n*(\frac{1}{2})^x=1
n∗(21)x=1
得时间复杂度为
O
(
log
2
n
)
O(\log_2n)
O(log2n)
最好情况下时间复杂度为
O
(
1
)
O(1)
O(1)
空间复杂度均为
O
(
1
)
O(1)
O(1)
这里知道二分法后其实很简单,要注意的就是最后的结果midmid也不一定等于x,所以要注意当midmid小于x的情况。
代码
class Solution {
public:
int mySqrt(int x) {
int l = 0, r = x, ans = -1;
while (l <= r) {
int mid = l + (r - l) / 2;
if ((long long)mid * mid < x) {
ans = mid;
l = mid + 1;
}
else if ((long long)mid * mid == x) {
return mid;
}
else {
r = mid - 1;
}
}
return ans;
}
};