随笔 - 384  文章 - 0  评论 - 0  阅读 - 13万

力扣367(java&python)-有效的完全平方数(简单)

题目:

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

进阶:不要 使用任何内置的库函数,如  sqrt 。

 

示例 1:

输入:num = 16
输出:true
示例 2:

输入:num = 14
输出:false
 

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-perfect-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

【二分查找】

因为 num 是正整数,若正整数 x 满足 x * x = num,则 x一定满足1≤ x ≤num。于是可以将 1 和 num 作为二分查找搜索区间的初始边界。

注意:

  • 当mid = x * x < num,则说明此时mid不是解,且其左边的数都不会是解,因此left  = mid +1。
  • 当mid = x * x > num,则说明此时mid不是解,且其右边的数都不会是解,因此right  = mid -1。
  • 当mid = x * x = num,则说明此时mid就是解,返回true。
  • 原先我写的while条件是:left < right,循环结束的条件是left = right,这样就会返回false,但是当left = right,此时的mid就可能是解,仍需要检查mid = (left  + right) / 2,即循环结束后需要判断最终left * left == num。如果while改成 left <= right,循环结束的条件是left > right,包含了left == right 的情况,就不需要额外判断。

java代码:

复制代码
 1 class Solution {
 2     public boolean isPerfectSquare(int num) {
 3         if (num == 1) return true;
 4         int left = 1, right = num;
 5         while(left <= right){
 6             int mid = left + (right - left) / 2;
 7             long temp = (long)(mid) * (long)(mid);
 8             if (temp < num){
 9                 left = mid + 1;
10             }else if(temp > num){
11                 right = mid - 1;
12             }else{
13                 return true;
14             }
15         }
16         return false;
17     }
18 }
复制代码

 python3代码:

复制代码
 1 class Solution:
 2     def isPerfectSquare(self, num: int) -> bool:
 3         if num == 1:
 4             return True
 5         left, right = 1, num / 2
 6         while left <= right:
 7             mid = left + (right - left) // 2
 8             temp = mid * mid
 9             if temp < num:
10                 left = mid + 1
11             elif temp > num:
12                 right = mid - 1
13             else:
14                 return True
15         return False
复制代码

2023-04-21二刷:java

复制代码
 1 class Solution {
 2     public boolean isPerfectSquare(int num) {
 3         if (num == 1)  return true;
 4         int left = 1, right = num / 2;
 5         while (left < right){
 6             int mid = left + (right - left) / 2;
 7             long temp = (long)(mid) * (long)(mid);
 8             if (temp < num){
 9                 left = mid + 1;
10             }else if (temp > num){
11                 right = mid - 1;
12             }else{
13                 return true;
14             }
15         }
16        return  left * left == num ? true : false;
17     }
18 }
复制代码

 

posted on   我不想一直当菜鸟  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示