LeetCode-367. Valid Perfect Square

Description

这里写图片描述

Note

这里写图片描述

Example 1

这里写图片描述

Example 2

这里写图片描述

Solution 1(C++)

class Solution {
public:
    bool isPerfectSquare(int num) {
        long sum=0, i=1;
        while(sum < num){
            sum+= i;
            i+= 2;
        }
        return sum==num;
    }
};

Solution 2(C++)

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

Solution 3(C++)

class Solution {
public:
    bool isPerfectSquare(int num) {
        long x=num;    //这里如果x类型为int,就会报错
        while(x*x > num){
            x= (x + num/x) /2;
        }
        return x*x == num;
    }
};

Solution 4(C++)

class Solution {
public:
    bool isPerfectSquare(int num) {
        if(num <= 0) return false;

        int left = 1, right = num;

        while(left <= right){
            int mid = left + (right - left)/2;
            //用除法可以避免溢出
            if(mid > num / mid){
                right = mid - 1;
            }else if(mid < num / mid){
                left = mid + 1;
            }else{
                return num % mid == 0;
            }
        }
        return false;
    }
};

算法分析

解法一&解法二: 这两种解法均是利用奇数数列的总和为n的平方来计算的,需要注意的是解法一中sum的类型要定义为long。因为num是int,当sum有可能大于num的时候,自然sum的类型设定为long更好。

解法三: 解法三是利用牛顿迭代法来计算的,关键地方根据平方函数做了简化,具体的解释可参考:平方根。牛顿迭代法也是计算机计算平方根的方法,同样需要注意数的范围。

解法三: 二分查找的方法。需要注意的地方就是该程序中没有使用long类型,因为使用了除法来防止溢出,非常的聪明。这一点可以留意一下。

程序分析

这道题也是考察基本的数学功底。但是对于实际程序编写来说,还是要好好注意数值的范围的。用一个类型的数就应该考虑是否会发生溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值