LeetCode 刷题 [C++] 第367题. 有效的完全平方数 (等差数列、二分法、牛顿迭代法)

博客围绕判断正整数是否为完全平方数展开,不使用内置库函数。介绍了三种方法:等差数列法,利用奇数序列和表示平方数;二分法,通过不断缩小猜测范围判断;牛顿迭代法,从初始近似值逼近根。还给出各方法复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

示例 1:
输入:16
输出:True

示例 2:
输入:14
输出:False

一、等差数列法
根据等差数列公式:1+3+5+…+(2n-1)=n^2
因此任意一个平方数可以表示成这样的奇数序列和

具体代码实现如下:

class Solution {
public:
    bool isPerfectSquare(int num) {
        if(num < 2) return true;
        int sub=1;
        while(num > 0) {
            num -= sub;
            sub += 2;
        }
        return num == 0;
    }
};

复杂度分析

  1. 时间复杂度:O(sqrt(N))。
  2. 空间复杂度:O(1)。

AC结果
在这里插入图片描述

二、 二分法
1.若 num < 2,返回 true。
2.设置左边界L为 2,右边界R为 num/2。
3.当 L <= R时:令 x = L + (R-L)/2 作为一个猜测,计算当前猜测值的平方tmp = x * x ,并与 num做比较:

  • 如果 tmp > num, 设置左边界 L = x+1;
  • 如果 tmp > num ,设置右边界 R = x-1;
  • 否则 num 是一个完全平方数,返回 true。

4.如果在循环体内没有找到,则说明 num 不是完全平方数,返回 false。

class Solution {
public:
    bool isPerfectSquare(int num) {
        if(num < 2) return true;
        long L=2,R=num/2,mid=0;
        while(L<=R) {
            mid = L + (R-L)/2;
            if(mid * mid > num) R = mid-1;
            else if(mid * mid < num) L = mid+1;
            else return true;
        }
        return false;
    }
};

复杂度分析

  1. 时间复杂度:O(log⁡N)。
  2. 空间复杂度:O(1)。

AC结果
在这里插入图片描述

三、牛顿迭代法
牛顿迭代法的思想是从一个初始近似值开始,进行一系列改进,进而逼近根的过程
那么如何从初始近似值逼近根呢?下面给出粗略的推导公式:
在这里插入图片描述
解题步骤
1.首先取num/2作为初始近似值。
2.当 x * x > num时,用牛顿迭代法取计算下一个近似值:x=(x+num/x)/2。
3.循环执行步骤2直至跳出循环,返回 x*x == num。

class Solution {
public:
    bool isPerfectSquare(int num) {
        if(num < 2) return true;
        long tmp = num >> 1;
        while(tmp*tmp > num) 
            tmp = (tmp + num/tmp) >> 1;
        return tmp*tmp == num;
    }
};

复杂度分析

  1. 时间复杂度:O(log⁡N)。
  2. 空间复杂度:O(1)。

AC结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值