《算法分析与设计》Week 17

367. Valid Perfect Square


Description:

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.



Solution:

一、题意理解

     就是给定一个矩形的面积(正整数)。看它是不是正方形。


二、分析

     1、题意很明确,我们的目标就是给定一个正整数num,看它能不能写成 num = n*n的形式,我们可以从1~num-1;优化一点,1~num/2;再优化一点,sqrt(num-1) ~ sqrt(num)+1这些范围内寻找一个整数n,看是否有n*n=num。但是题目明确说了不能使用sqrt。

     2、上面的解法依然是属于o(n)的时间复杂度,并不是我们想要的效果。这题的本质其实是一个查找问题,而查找的话,比较快速的算法就是二分查找。所以我们完全可以在1~num的范围内运用二分查找,来找到这样一个n,使得n*n= num。时间复杂度为O(Log(n))

     3、代码如下所示:

class Solution {
public:
    bool isPerfectSquare(int num) {
        long begin = 1, end = num;
        
        while(begin <= end)
        {
            long flag = (begin + end) / 2;
            long square = flag * flag;
            if(square == num)
                return true;
            else if(square > num)
                end = flag - 1;
            else
                begin = flag + 1;
        }
        return false;
    }
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值