题目:

给定一个 正整数 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 }

力扣367(java&python)-有效的完全平方数(简单)的更多相关文章

  1. 力扣561. 数组拆分 I-C语言实现-简单题

    题目 传送门 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(a ...

  2. 力扣566. 重塑矩阵-C语言实现-简单题

    题目 传送门 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要 ...

  3. 力扣832. 翻转图像-C语言实现-简单题

    题目 传送门 文本 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...

  4. 力扣896. 单调数列-C语言实现-简单题

    题目 传送门 文本 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的. 如果对于所有 i <= j, ...

  5. LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组   中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...

  6. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

  7. 力扣—Reorder List(重排链表)python实现

    题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...

  8. 力扣 ——Linked List Cycle II(环形链表 II) python实现

    题目描述: 中文: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). ...

  9. 力扣——Linked List Cycle(环形链表) python实现

    题目描述: 中文: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...

  10. 力扣——Copy List with Random Pointer(复制带随机指针的链表) python实现

    题目描述: 中文: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. 示例: 输入:{"$id":" ...

随机推荐

  1. translate speaker 翻译朗读者API - vscode 插件推荐 单词发音

    translate speaker 翻译朗读者API - vscode 插件推荐 单词发音 有个小bug,就是发音发两次,改个配置就好了. "translateSpeaker.mode&qu ...

  2. 音标 舌侧音 /l/ 的发音 - 英语

    音标 舌侧音 /l/ 的发音 这个音标 首先确定下 就是一个音 发 了(注意 发音方式不是中文的了,是英文的了) 注意发音方式很重要 中文 '了',重点在 偏鼻音(发射方向为前上方) 英文 '了',重 ...

  3. 简单实用算法—分布式自增ID算法snowflake(雪花算法)

    目录 算法概述 ID结构 算法特性 算法代码(C#) 算法测试 算法概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先 ...

  4. Prometheus常用exporter及其常用监控指标

    node-exporter常用监控指标 CPU相关指标: node_cpu_seconds_total{mode="idle"}:CPU空闲时间(秒)的总和.这是评估CPU使用率的 ...

  5. python librosa 实例解析

    一 概念 librosa是一个用于音乐和音频分析的python包.它提供了创建音乐信息检索系统所需的构建块. 核心函数:   二 实例解析   实例A,确认是否安装成功: import librosa ...

  6. 24_用Qt和FFmpeg实现简单的YUV播放器

    前面文章FFmpeg像素格式转换中我们使用FFmpeg实现了一个像素格式转换工具类,现在我们就可以在Qt中利用QImage很容易的实现一个简单的YUV播放器了. 播放器功能很简单,只有播放.暂停和停止 ...

  7. vscode 屏蔽某些文件夹

    vscode 屏蔽某些文件夹 File--Preferences--Settings(Ctrl + ,) 搜索框里搜索 Files:Exclude 点击 Add Pattern ,如果想屏蔽掉所有 . ...

  8. Win10下安装Java JDK 1.8 配置环境变量

    1.下载地址:https://www.oracle.com/java/technologies/javase-downloads.html 2.双击运行,下一步.下一步-- 3.新建变量名:JAVA_ ...

  9. NetAdapt:MobileNetV3用到的自动化网络简化方法 | ECCV 2018

    NetAdapt的思想巧妙且有效,将优化目标分为多个小目标,并且将实际指标引入到优化过程中,能够自动化产生一系列平台相关的简化网络,不仅搜索速度快,而且得到简化网络在准确率和时延上都于较好的表现   ...

  10. C++设计模式 - 原型模式(Prototype)

    对象创建模式 通过"对象创建" 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fac ...