LeetCode 367.有效的完全平方数

题目

给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。

解题思路

  • 二分查找:首先我们要明确二分查找的使用前提是:对于一组排好顺序的数,对于本题来说在寻找平方根时,已经有了顺序(从1到Math.sqrt(num)),剩下的只需要根据二分查找的基本思路即可。

  • Java实现:

class Solution {
  public boolean isPerfectSquare(int num) {
    //二分查找
    if (num < 2) {
      return true;
    }
    //确定起始的左端点和右端点
    long left = 2;
    long right = num / 2;
    //x为变化迭代的平方根,check为校验数
    long  x,check;
    while (left <= right) {
      x = (left + right) / 2;
      check = x * x;
      if (check == num) {
        return true;
      }
      if (check < num) {
        left = x + 1;
      } else {
        right = x - 1;
      }
    }
    return false;
  }
}

时间复杂度:O(logN)
空间复杂度:O(1)

  • 牛顿迭代法:代数推导以及几何推导过程如下
    在这里插入图片描述
  • Java实现:
class Solution {
    public boolean isPerfectSquare(int num) {
        //选定2为界限
        // x^2 与 2x 的交点的横坐标为2
        if (num < 2) {
            return true;
        }
        //选定初值,根据x^2 与 2x 两个函数的增长速度可以判断出在x>2之后 x^2的增长速度更快
        //所以当x>2时一个数的平方根要小于它的一半
        long x = num / 2;

        //不断迭代,因为选定的初值大于所要寻找的根
        while (x * x > num) {
            x = (x + num / x) / 2;
        }                                                                                                         
        return x * x == num;

    }
}

时间复杂度:O(logN)
空间复杂度:O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值