Valid Perfect Square

有效的完全平方数

题目描述

给定一个正整数,判断是否为完全平方数。不要使用库函数。

示例:

输入:15
输出:false

解法

解法一:牛顿法

  • 时间复杂度:O(logn)

  • 空间复杂度:O(1)

func isPerfectSquare(num int) bool {
    if num < 2 {
        return true
    }
    x := num / 2
    for x*x > num {
        x = (x + num/x) / 2
    }
    return x*x == num
}

解法二:二分法

  • 时间复杂度:O(logn)

  • 空间复杂度:O(1)

func isPerfectSquare(num int) bool {
    left, right := 0, num
    for left <= right {
        mid := left + (right-left)/2
        if mid*mid == num {
            return true
        }
        if mid*mid > num {
            right = mid - 1
        } else {
            left = mid + 1
        }
    }
    return false
}

解法三:二分法2

  • 时间复杂度:O(logn)

  • 空间复杂度:O(1)

func isPerfectSquare(num int) bool {
    ans := 0
    for i := 30; i >= 0; i-- {
        tmp := ans + (1 << i)
        if tmp*tmp > num {
            continue
        }
        if tmp*tmp == num {
            return true
        }
        ans = tmp
    }
    return false
}

解法四:利用1 + 3 + ... + (2n-1) = n^2

  • 时间复杂度:O(logn)

  • 空间复杂度:O(1)

func isPerfectSquare(num int) bool {
    layer := 1
    for num > 0 {
        num -= 2*layer - 1
        layer++
    }
    return num == 0
}

Last updated

Was this helpful?