题目:

给定一个 正整数 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. [noip2015]运输计划(LCA,二分)

    运输计划[做题笔记] 挺难绷的... 题意 概括:给定 \(n\) 个节点的树和 \(n-1\) 条边的权值,现在可以将一条边的权值改为 \(0\) .找出一条边,使得将这条边权值赋为 \(0\) 时 ...

  2. .NET周刊【3月第2期 2024-03-17】

    国内文章 开源.NET8.0小项目伪微服务框架(分布式.EFCore.Redis.RabbitMQ.Mysql等) https://www.cnblogs.com/aehyok/p/18058032 ...

  3. ItemTouchHelper 实现交互动画

    目录介绍 01.拖拽需要实现功能 02.几个重要的方法说明 03.简单实现思路 04.拖拽效果上优化 05.完整代码展示 好消息 博客笔记大汇总[16年3月到至今],包括Java基础及深入知识点,An ...

  4. 记录--用js如何实现将手机号中间的几位数字变成****

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 今天,我们要实现一个很常见并且简单的功能:将手机号中间的几位数变成**** 这个功能其实很常见,比如我们微信的账号安全里面显示的手机号.掘 ...

  5. web前端工程化合集

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.Git 1. git 和 svn 的区别 git 和 svn 最大的区别在于 git 是分布式的,而 svn 是集中式的.因此我们不能 ...

  6. 记录--Vue开发历程---音乐播放器

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.audio标签的使用 1.Audio 对象属性 2.对象方法 二.效果 效果如下: 三.代码 代码如下: MusicPlayer.vu ...

  7. MacOS安装 JDK 及动态切换版本

    MacOS安装 JDK 及动态切换版本 JDK下载  我自己使用的是Mac m2系列.无所谓用的哪一种开源的OPEN JD,按需下载,我下载了8,11,17三个版本. 安装完成后,终端输入 java ...

  8. .NET分布式Orleans - 5 - 持久化

    在分布式系统中,数据的持久化是至关重要的一环. Orleans 7 引入了强大的持久化功能,使得在分布式环境下管理数据变得更加轻松和可靠. 本文将介绍什么是 Orleans 7 的持久化,如何设置它以 ...

  9. KingbaseES数据库运维案例之---permission denied to create "sys_catalog.xxx"

    ​ KingbaseES数据库运维案例之---permission denied to create "sys_catalog.bdsj_bdgl_test" 案例说明: 在Kin ...

  10. 初学STM32 CAN通信(二)

    初学STM32 CAN通信(二) 1. STM32的CAN外设 ​ STM32的芯片中具有bxCAN控制器 (Basic Extended CAN),它支持CAN协议2.0A和2.0B标准. ​ 该C ...