zoukankan      html  css  js  c++  java
  • leetcode 367. Valid Perfect Square

    Given a positive integer num, write a function which returns True if num is a perfect square else False.

    Note: Do not use any built-in library function such as sqrt.

    Example 1:

    Input: 16
    Returns: True
    

    Example 2:

    Input: 14
    Returns: False
    

    Credits:
    Special thanks to @elmirap for adding this problem and creating all test cases.

    经典的二分查找:

    class Solution(object):
        def isPerfectSquare(self, num):
            """
            :type num: int
            :rtype: bool
            """
            # find n in (1, num) that n*n == num
            # binary search
            i, j = 1, num
            while i <= j:
                mid = (i+j)>>1
                s = mid*mid
                if s == num:
                    return True
                elif s > num:
                    j = mid-1
                else:
                    i = mid+1
            return False
    

     其他解法:

    class Solution(object):
        def isPerfectSquare(self, num):
            """
            :type num: int
            :rtype: bool
            """
            x = int(round(math.exp(math.log(num)/2)))
            return x*x == num
    

     注意,int(round(xxx))是经典写法,记住!

    另外的解法:A square number is 1+3+5+7+..., JAVA code,不知道这个是否数学证明过。。。

    class Solution(object):
        def isPerfectSquare(self, num):
            """
            :type num: int
            :rtype: bool
            """
            i = 1
            while num > 0:
                num -= i
                i += 2
            return num == 0
    

     最后就是牛顿法求解了。

    class Solution(object):
        def isPerfectSquare(self, num):
            """
            :type num: int
            :rtype: bool
            """
            x = num;
            while (x * x > num):
                x = (x + num / x) >> 1        
            return x * x == num
    

    但是不知道是否严密,因为num/x是整数相除,我自己倾向于下面这样解:

    class Solution(object):
        def isPerfectSquare(self, num):
            """
            :type num: int
            :rtype: bool
            """
            prev, cur = 0, num
            while abs(prev-cur)>1e-6:
                cur,prev=0.5*(cur+num/cur),cur
            x = int(round(cur))
            return x*x == num
    
  • 相关阅读:
    JavaScript----数组方法
    JavaScript----数组
    JavaScript----Array.foreach()
    JavaScript----数字及数字方法
    JavaScript----函数,对象及字符串方法
    设计模式@第5章:单例设计模式
    设计模式@第4章:设计模式概述
    设计模式@第3章:UML 类图
    部署方案@常用软件的安装
    应用框架@SpringBoot
  • 原文地址:https://www.cnblogs.com/bonelee/p/9185445.html
Copyright © 2011-2022 走看看