69.x的平方根

131 阅读1分钟

1.题目

实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

输入: 4

输出: 2

示例 2:

输入: 8

输出: 2

说明: 8 的平方根是 2.82842...,

  由于返回类型是整数,小数部分将被舍去。

2.答题

2.1 思路1(二分法)

取high为x,low为0

middle为high和low的中间值,

若middle * middle 等于 x,middle为指定值

若middle * middle 大于 x,low右移为middle的值

若middle * middle 小于 x,high左移为middle的值

边界值:x==0或1时,返回x。

注:测试的时候8总是超时,跟进看了一下当low==2、high==3时,死循环了,所以改变了循环判断条件为low < high - 1

class Solution {
    public int mySqrt(int x) {
        if (x == 1) {
            return 1;
        }

        int low = 0;
        int high = x;

        while (low < high - 1) {
            int middle = (low + high) / 2;
            int val = x / middle;
            if (val == middle) {
                return middle;
            } else if (val > middle) {
                low = middle;
            } else {
                high = middle;
            }
        }
        return low;
    }
}

时间复杂度

由于使用了1层循环的嵌套,所以为:O(n)

空间复杂度

常量空间复杂度:O(1)

提交结果