⭐算法入门⭐《二分枚举》简单06 —— LeetCode 367. 有效的完全平方数
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《二分枚举》简单06 —— LeetCode 367. 有效的完全平方数相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
C语言免费动漫教程,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?先看简单题! 🧡《C语言入门100例》🧡
数据结构难?不存在的! 🌳《画解数据结构》🌳
闭关刷 LeetCode,剑指大厂Offer! 🌌《算法入门指引》🌌
LeetCode 太简单?算法学起来! 💜《夜深人静写算法》💜
一、题目
1、题目描述
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。不要 使用任何内置的库函数,如 sqrt 。
样例输入:16
样例输出:true
2、基础框架
- C语言 版本给出的基础框架代码如下:
bool isPerfectSquare(int num){
}
3、原题链接
二、解题报告
1、思路分析
1)二分枚举答案,找到一个最大的
x
x
x,满足
x
2
≤
n
u
m
x^2 \\le num
x2≤num,注意加法和乘法的溢出,最简单的办法就是用long long
;
2)如果
x
2
=
n
u
m
x^2 = num
x2=num 返回true
,否则返回false
;
2、时间复杂度
- 二分枚举答案,时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2n)。
3、代码详解
#define ll long long
bool isPerfectSquare(int num){
int l = 1, r = num;
int mid;
ll ans, mid2;
while(l <= r) {
mid = ((ll)l + r) >> 1; // (1)
mid2 = (ll)mid * mid;
if(mid2 <= num) {
l = mid + 1; // (2)
ans = mid;
}else {
r = mid - 1; // (3)
}
}
return ans*ans == num; // (4)
}
- ( 1 ) (1) (1) 确保加法不会溢出;
- ( 2 ) (2) (2) 如果 m i d 2 ≤ n u m mid^2 \\le num mid2≤num,则 m i d mid mid 一定是一个可行解,并且最优解可能在 [ m i d + 1 , r ] [mid+1, r] [mid+1,r] 范围内;
- ( 3 ) (3) (3) 否则,最优解可能出现在 [ l , m i d − 1 ] [l, mid-1] [l,mid−1];
- ( 4 ) (4) (4) 返回是否正好等于;
三、本题小知识
写二分枚举的时候,在计算中间点时,加法可能产生
int32
的溢出,可以暴力采用long long
。
以上是关于⭐算法入门⭐《二分枚举》简单06 —— LeetCode 367. 有效的完全平方数的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《二分枚举》中等06 —— LeetCode 275. H 指数 II
⭐算法入门⭐《二分枚举》简单08 —— LeetCode 441. 排列硬币
⭐算法入门⭐《二分枚举》简单05 —— LeetCode 1. 两数之和
⭐算法入门⭐《二分枚举》简单07 —— LeetCode 69. x 的平方根