力扣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 }
力扣367(java&python)-有效的完全平方数(简单)的更多相关文章
- 力扣561. 数组拆分 I-C语言实现-简单题
题目 传送门 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(a ...
- 力扣566. 重塑矩阵-C语言实现-简单题
题目 传送门 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要 ...
- 力扣832. 翻转图像-C语言实现-简单题
题目 传送门 文本 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...
- 力扣896. 单调数列-C语言实现-简单题
题目 传送门 文本 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的. 如果对于所有 i <= j, ...
- LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组 中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...
- LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...
- 力扣—Reorder List(重排链表)python实现
题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...
- 力扣 ——Linked List Cycle II(环形链表 II) python实现
题目描述: 中文: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). ...
- 力扣——Linked List Cycle(环形链表) python实现
题目描述: 中文: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...
- 力扣——Copy List with Random Pointer(复制带随机指针的链表) python实现
题目描述: 中文: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. 示例: 输入:{"$id":" ...
随机推荐
- python数组概念和实例解析
一 概念 如果我们需要一个只包含数字的列表,那么array.array比list更高效.数组支持所有跟可变序列有关的操作,包括.pop,.insert和.extend. 另外,数组还提供从文件读取和存 ...
- Kotlin 语法糖(对象不为空返回自身,为空返回其他)
原文地址: Kotlin 语法糖(对象不为空返回自身,为空返回其他) - Stars-One的杂货小窝 开发中,经常会有这样逻辑: 判断对象如果不为空,则取对象本身; 为空,则得到其他对象; 然后每次 ...
- Android Studio导出APP的数据库db文件
原文地址:Android Studio导出APP的数据库db文件 | Stars-One的杂货小窝 最近项目开发需要使用到Android内置的Sqlite存数据,但是公司里没有对应的调试环境,只能让现 ...
- buntu之命令行模式和图形界面切换
1.按ALT+CTRL+F1切换到字符界面(Linux实体机) 如果是VMware虚拟机安装的Linux系统,则切换到字符界面的时候需要以下操作 按下ALT+CTRL+SPACE( ...
- echo: nice day
乐开花了,echo 姑娘,很合我的胃口,活泼.俏皮.专业.三观出乎的齐,第一次遇见这种默契度如此高的,你说半句我懂,我说半句你懂,太完美了,以前感觉和女生沟通太累,聊几句就 game over,我这是 ...
- 3DCAT实时云渲染助力VR虚拟现实迈向成熟
近年来,虚拟现实(Virtual Reality, VR)技术在市场上的应用越来越广泛,虚拟现实已成为一个热门的科技话题.相关数据显示,2019年至2021年,我国虚拟现实市场规模不断扩大,从2019 ...
- C++ Concurrency in Action 读书笔记三:并发操作的同步
Chapter 4 并发操作的同步·Synchronizing concurrent operations
- Python数据类型---列表、元祖、字典【详解】
一.列表(List) 1.列表可以用来存储不同的数据类型,使用 [ ] e.g. 1 service = ['http','ssh','ftp'] 2.列表是有索引的,也就是可以通过下标来访问数据 3 ...
- #离线,倒序,线段树#Comet OJ - Contest #15 E 栈的数据结构题
题目 初始时有 \(N\) 个空的栈,编号为 \(1 \sim N\),有以下三种类型的指令: push \(L\) \(R\) \(v\):把编号 \(L \sim R\) 这连续 \(R-L+1\ ...
- 深入理解 Java 多线程、Lambda 表达式及线程安全最佳实践
Java 线程 线程使程序能够通过同时执行多个任务而更有效地运行. 线程可用于在不中断主程序的情况下在后台执行复杂的任务. 创建线程 有两种创建线程的方式. 扩展Thread类 可以通过扩展Threa ...