版权声明:版权所有,转载请注明原网址链接。 https://blog.csdn.net/qq_41231926/article/details/82861877
我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/sqrtx/description/
题目描述:
知识点:二分法
思路一:从1开始逐个查找
思路一是最先能想到的简单粗暴的解法。从数字1开始找,一旦找到平方值等于x的数字i,直接返回i。如果找到平方值大于x的数字i,需要返回i - 1。
需要注意的是,为了防止做乘法运算时越界,需要强转为long类型。
时间复杂度是O(sqrt(x))。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public int mySqrt(int x) {
for (long i = 1; i <= x; i++) {
if(i * i > x) {
return (int)(i - 1);
}else if(i * i == x) {
return (int)i;
}
}
return 0;
}
}
LeetCode解题报告:
思路二:二分查找法
思路一的时间复杂度太高,可以用二分法进行改进。
需要注意的是,二分查找法查找到的mid值并不是最终能够返回的值。我们需要做进一步的判断。如果此时mid * mid大于x,我们需要返回的是mid - 1。如果mid * mid <= x,我们才可以返回mid。
运算过程中涉及到乘法运算时同样需要强转为long类型防止越界。
时间复杂度是O(logx)。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public int mySqrt(int x) {
int left = 1;
int right = x;
int mid = left + (right - left) / 2;
while(left < right) {
if((long)mid * (long)mid == x) {
break;
}else if((long)mid * (long)mid > x) {
right = mid - 1;
mid = left + (right - left) / 2;
}else if((long)mid * (long)mid < x) {
left = mid + 1;
mid = left + (right - left) / 2;
}
}
return (long)mid * (long)mid > x ? mid - 1 : mid;
}
}
LeetCode解题报告: