367.有效的完全平方数(力扣LeetCode)

2024-01-26 09:44

本文主要是介绍367.有效的完全平方数(力扣LeetCode),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

367.有效的完全平方数

题目描述

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

完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。

不能使用任何内置的库函数,如 sqrt 。

示例 1:

输入:num = 16
输出:true
解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。

示例 2:

输入:num = 14
输出:false
解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。

提示:

  • 1 <= num <= 231 - 1

浮点数二分

因为在二分查找结束后,r 保存了逼近的平方根值,所以r*r要强制类型转换为int类型

// 定义解决问题的类 Solution
class Solution {
public:// 判断正整数 num 是否为完全平方数的函数bool isPerfectSquare(int num) {// 设置二分查找的范围,从0到numdouble l = 0, r = num;// 使用二分查找来逼近平方根的值// 当左右边界的差距小于1e-6时停止查找// 这里的1e-6是一个小的阈值,用于控制查找精度while (r - l >= 1e-6) {// 计算中点值double mid = (r + l) / 2;// 如果 mid 的平方大于或等于 num,更新右边界 rif (mid * mid >= num) r = mid;// 否则,更新左边界 lelse l = mid;}// 如何判断一个数是完全平方数?// 一个数如果是完全平方数,其平方根一定是整数。// 在二分查找结束后,r 保存了逼近的平方根值,// 将其强制转换成整数然后再平方,看是否等于原始数值 num。// 如果相等则表示 num 是完全平方数,返回 true// 否则表示 num 不是完全平方数,返回 falseif ((int)r * (int)r == num) return true;return false;}
};

整数二分

因为当 mid 为 46341 或更大时,mid * mid 的结果会超过 int 类型能表示的最大值,从而导致溢出,所以需要long long来防止溢出

// 定义解决问题的类 Solution
class Solution {
public:// 函数用来判断 num 是否为完全平方数bool isPerfectSquare(int num) {// 使用 long long 类型来避免在计算过程中可能出现的整数溢出long long l = 0;long long r = num;// 使用二分查找算法来确定是否存在整数 n 使得 n*n == numwhile (l < r) {// 计算中间值,注意这里为了运算符优先级,先进行加法操作,再进行右移一位操作以除以2// 右移运算符具有比加法更高的优先级,所以必须确保加法在右移之前执行long long mid = (r + l) >> 1;// 如果 mid 的平方大于或等于 num,那么需要在左侧区间 [l, mid] 中继续查找if (mid * mid >= num) {r = mid;} // 如果 mid 的平方小于 num,那么需要在右侧区间 [mid+1, r] 中继续查找else {l = mid + 1;}}// 经过上面的循环,如果 num 是完全平方数,则 l (或 r) 将等于 num 的平方根// 检查 l 的平方是否等于 num 来确定 num 是否为完全平方数if (l * l == num) return true;// 如果 l 的平方不等于 num,则说明 num 不是完全平方数return false;}
};

这篇关于367.有效的完全平方数(力扣LeetCode)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/646408

相关文章

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return