题目:

给定一个 正整数 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. great [ɡreɪt] ɡr 然后 eɪt 单词发音 r和前面的辅音连读

    great [ɡreɪt] ɡr 然后 eɪt 单词发音 r和前面的辅音连读

  2. Nginx的负载均衡策略(4+2)

    Nginx的负载均衡策略主要包括以下几种: 轮询(Round Robin):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除.这是Nginx的默认策略,适合服务器配置 ...

  3. 多线程系列(二十) -CompletableFuture使用详解

    一.摘要 在上篇文章中,我们介绍了Future相关的用法,使用它可以获取异步任务执行的返回值. 我们再次回顾一下Future相关的用法. public class FutureTest { publi ...

  4. 搭建Spring Cloud父工程

    1.首先创建一个maven项目 删除src目录,当做一级目录用来管理第三方jar版本控制. 2.配置pom文件. SpringCloud.SpringCloudAlibaba.SpringBoot版本 ...

  5. KingbaseESV8R6用户登录失败自动锁定后解锁遇到权限问题

    测试用户登录失败自动锁定 创建用户tee并授权. TEST=# create user tee; CREATE ROLE TEST=# alter user tee with createdb; AL ...

  6. 如何在Java中读取超过内存大小的文件

    读取文件内容,然后进行处理,在Java中我们通常利用 Files 类中的方法,将可以文件内容加载到内存,并流顺利地进行处理.但是,在一些场景下,我们需要处理的文件可能比我们机器所拥有的内存要大.此时, ...

  7. 开启 Keep-Alive 可能会导致http 请求偶发失败

    大家好,我是蓝胖子,说起提高http的传输效率,很多人会开启http的Keep-Alive选项,这会http请求能够复用tcp连接,节省了握手的开销.但开启Keep-Alive真的没有问题吗?我们来细 ...

  8. #容斥#51nod 1407 与与与与

    题目 给出 \(n\) 个数,问有多少个子集的按位与为0 分析 考虑容斥,设 \(f[i]\) 表示有多少个数按位与为 \(x\),满足 \(x\&i=i\) 那么答案就是 \(\sum_{i ...

  9. [一本通1700]PFS集合

    题目描述 有一种特殊的集合叫做PFS(Prefix Free Set)集合. 一个PFS集合由若干字符串构成,且不存在一个字符串是另一个字符串的前缀.空集也被看作是PFS集合. 例如 {\(" ...

  10. Java ArrayList 与 LinkedList 的灵活选择

    Java ArrayList Java ArrayList 类是一个可变大小的数组,位于 java.util 包中. 创建 ArrayList import java.util.ArrayList; ...