Leetcode No.367有效的完全平方数 牛顿迭代法

题目大意

给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
示例1

输入:16
输出:True

示例2

输入:14
输出:False

方法一:二分法

首先打表,存储int范围内的所有完全平方数,然后对表进行二分查找。

public boolean isPerfectSquare(int num) {
       int[] square = new int[((int)Math.sqrt(Integer.MAX_VALUE))+1];
        for(int i=0;i<square.length;i++)
            square[i] = i*i;
        int low = 0, high = square.length-1;
        while(low<high) {
            int mid = low + (high-low)/2;
            if(square[mid] == num) return true;
            else if(square[mid] < num) 
                low = mid + 1;
            else
                high = mid - 1;
        }
        return square[low] == num;
    }

运行时间4ms,击败14.13%。

方法三:暴力迭代 超时

迭代的方法,依次尝试,这题会超时。

 public boolean isPerfectSquare(int num) {
         int i=0;
         while(i*i<num) 
            i++;
         return i*i==num;
     }

方法三:公式法

2^n = 1 + 3 + 5 +...+ 2*k-1

public boolean isPerfectSquare(int num) {
        int i=1;
        while(num>0) {
            num -= i;
            i+=2;
        }
        return num == 0;
    }

方法四:牛顿迭代法

image.png

因为此题求x^2 = n。构造函数f(x) = x^2 - n。
f'(x) = 2x.

 public boolean isPerfectSquare(int num) {
        int r = num;
        while((double)r*r > num) 
            r = (r + num/r)/2;
        return r*r ==num;
    }

运行时间0ms,击败100%。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • “大家最喜爱的、健忘的多莉回来了!这次她将与好朋友尼莫与马林一起,寻找她的神秘过去和她遗失的家庭。” 这是电影《海...
    电影咖阅读 234评论 0 1
  • 我对口红有种偏爱,很爱。小时候看到杂志上的模特涂着颜色艳丽的口红,就看的着迷。大部分的女人对口红都毫无抵抗力,原因...
    小鱼游游跳龙门阅读 1,198评论 2 4
  • 正念是以一种特定的方式来觉察,即有意识地觉察(On Purpose)、活在当下(In the Present Mo...
    芷渃蒹葭阅读 2,549评论 30 62
  • 高中一次偶然的机会,在语文试卷上发现了石评梅的一篇文章,瞬间被她的文字吸引,以后的许多个晨读里,我都会拿着那张试卷...
    三池Mary阅读 443评论 0 0