LeetCode069——x的平方根

版权声明:版权所有,转载请注明原网址链接。 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解题报告:

猜你喜欢

转载自blog.csdn.net/qq_41231926/article/details/82861877