日新刷题 - 367. 有效的完全平方数

99 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

一、题目描述:

367. 有效的完全平方数 - 力扣(LeetCode)

给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false

进阶:

不要 使用任何内置的库函数,如  sqrt

 

示例 1:

输入:num = 16
输出:true

示例 2:

输入:num = 14
输出:false

提示:

  • 1 <= num <= 2^31 - 1

二、思路分析:

首先采用的思想是二分法,不会自己去看思想

关键之处在于判断语句如何理解?
对middle>num/middle 意思是middle的平方必然是大于num有足够余数
而middle<num/middle 意思是middle的平方必然是小于num有余数
中间一些情况,即使middle的平方不等于num,仍存在middle==num/middle,例如2==5/2;
这种情况的原因是num大于middle,且余数不够middle(num%middle!=0),属于num大于middle范围内;

三、AC 代码:


class Solution {
public:
    bool isPerfectSquare(int num) {
        if(num==1) return true;
        int left=0,right=num,middle;
        while(left<=right){
            middle=left+(right-left)/2;
            if(middle>num/middle) right=middle-1;
            else if(middle<num/middle || num%middle!=0) left=middle+1;
            else return true;
        }
        return false;
    }
};

四、总结:

该题与本站 69. x 的平方根 类似

等价于判断是否存在一个整数 x ,使得 x * x == num
使用二分查找,看能否找到这样的整数 x
查找成功,返回true
查找失败,返回false

五、参考:

执行用时 : 0 ms , 在所有 C++ 提交中击败了 100.00% 的用户 - 有效的完全平方数 - 力扣(LeetCode)

【C/C++】367. 有效的完全平方数 题解:经典二分的变形使用 - 有效的完全平方数 - 力扣(LeetCode)

Jhong | 367. 有效的完全平方数,注意溢出的坑就行 - 有效的完全平方数 - 力扣(LeetCode)

[Alton]-Binary Search / Newton's method + 有效的完全平方数 - 有效的完全平方数 - 力扣(LeetCode)