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 <= 2^31 - 1

二、解题思路

  1. 由于不能使用内置的 sqrt 函数,我们需要寻找一种不使用开方的方法来判断一个数是否是完全平方数。
  2. 一个简单的方法是使用二分查找。我们知道,如果一个数 num 是完全平方数,那么它的平方根一定在 1 到 num/2 + 1 的范围内。
  3. 我们可以在这个范围内进行二分查找,每次计算中间值的平方,如果平方结果等于 num,则说明 num 是完全平方数;如果平方结果大于 num,则说明平方根在左侧区间;如果平方结果小于 num,则说明平方根在右侧区间。
  4. 当查找区间为空时,如果仍未找到平方根,则说明 num 不是完全平方数。

三、具体代码

class Solution {public boolean isPerfectSquare(int num) {// 边界情况if (num < 2) {return true;}long left = 2, right = num / 2, mid, square;while (left <= right) {mid = left + (right - left) / 2;square = mid * mid;if (square == num) {return true;} else if (square > num) {right = mid - 1;} else {left = mid + 1;}}return false;}
}

在这段代码中,我们使用了 long 类型来避免在计算 mid * mid 时可能发生的整数溢出。同时,我们通过 left + (right - left) / 2 来计算中间值,以避免直接使用 (left + right) / 2 可能导致的整数溢出。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 初始时,我们设置 left 为 2,right 为 num / 2
  • 在二分查找的过程中,每次循环都会将查找区间缩小一半。
  • 假设需要经过 k 次循环才能结束二分查找,那么有 2^k = right - left + 1
  • 因为 right 的初始值为 num / 2,所以 k 最多为 log(num)(这里 log 表示以 2 为底的对数)。
  • 因此,时间复杂度为 O(log(num))。
2. 空间复杂度
  • 在整个算法中,我们只使用了常数个额外空间,即 leftrightmid 和 square 这几个变量。
  • 这些变量所占用的空间不会随着输入 num 的大小而改变。
  • 因此,空间复杂度为 O(1)。

综上所述,该算法的时间复杂度为 O(log(num)),空间复杂度为 O(1)。

五、总结知识点

  • 类定义

    • 使用 class 关键字定义一个名为 Solution 的类。
  • 方法定义

    • 在类中定义一个名为 isPerfectSquare 的公共方法,它接受一个整数参数 num 并返回一个布尔值。
  • 基本数据类型

    • 使用 int 类型来定义方法的参数和返回类型。
    • 使用 long 类型来避免在计算过程中可能出现的整数溢出。
  • 边界条件处理

    • 在方法开始时,检查 num 是否小于 2,因为 0 和 1 都是完全平方数。
  • 二分查找算法

    • 使用二分查找算法来寻找可能的平方根,这是一种有效的查找算法,适用于有序数据集。
  • 循环结构

    • 使用 while 循环来实现二分查找,条件是 left 小于等于 right
  • 数学运算

    • 使用乘法运算 * 来计算 mid 的平方。
    • 使用除法运算 / 来初始化 right 变量。
    • 使用加法和减法运算来更新 left 和 right 的值。
  • 条件判断

    • 使用 if-else 语句来判断 square 是否等于 num,以及如何调整 left 和 right 的值。
  • 类型转换

    • 将 num 除以 2 的结果转换为 long 类型,以避免在计算 right 时发生整数溢出。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三届北京国际水利科技博览会将于25年3月在国家会议中心召开

由中国农业节水和农村供水技术协会、北京水利学会、振威国际会展集团等单位联合主办的第三届北京国际水利科技博览会暨供水技术与设备展&#xff08;北京水利展&#xff09;将于2025年3月31日至4月2日在北京•国家会议中心举办&#xff01; 博览会以“新制造、新服务、新业态”…

使用web.dev提供的工具实现浏览器消息推送服务

文章目录 前言实现工具和效果实现原理实现过程前端接收用户订阅请求将用户订阅信息更新到后端后端实现接收并保存订阅信息的接口后端实现消息推送的逻辑前言 对于电商独立站来说,新品上架或者促销活动上线及时通知到用户是很重要的,通知的渠道有很多,其中就包括浏览器消息推…

掌握AI Prompt的艺术:如何有效引导智能助手

开头叙述&#xff1a; 在人工智能的世界里&#xff0c;Prompt&#xff08;提示&#xff09;是沟通人类意图与机器理解之间的桥梁。它不仅是一串简单的文字&#xff0c;而是一把钥匙&#xff0c;能够解锁AI模型的潜力&#xff0c;引导它们执行复杂的任务。本文将探讨Prompt的重…

[MySQL]DQL查询语句的执行顺序

在MySQL的查询语句中&#xff0c;各个关键字的编写顺序为 1:SELECT 字段列表 2:FROM 表名 3:WHERE 条件 4:GROUP BY 分组字段列表 5:HAVING 分组后条件列表 6:ORDER BY 排序条件 7:LIMIT 分页条件 执行顺序并非像编写时的顺序一致: 1:FROM 表名 2:WHERE 条件 3:GROUP BY 分组…

ElementUI el-table 多选以及点击某一行的任意位置就勾选上

1. 需求 在el-table中&#xff0c;需要实现多选功能&#xff0c;并且点击某一行的任意位置就勾选上&#xff0c;而不是点击复选框才勾选上。 2. 实现思路 在el-table中添加ref属性&#xff0c;用于获取表格实例。在el-table-column中添加type"selection"属性&…

深度学习优化器【学习率调整和梯度修正,Optimizer】

文章目录 一、学习率调整1 余弦退火&#xff08;1&#xff09;Warm up&#xff08;2&#xff09;Cosine Anneal 2 AdaGrad3 RMSprop算法4 AdaDelta算法 二、梯度估计修正1 动量法2 Nesterov加速梯度3 Adam修正的原因 4 AdamW 三、总结参考资料 在当今快速发展的人工智能领域&am…

运算符重载详解,日期类型的实现

一、运算符重载 当运算符被⽤于类类型的对象时&#xff0c;C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时&#xff0c;必须转换成调⽤对应运算符重载&#xff0c;若没有对应的运算符重载&#xff0c;则会编译报错。 类中含有多种变量&#xff0…

windows 11 配置 kafka 使用SASL SCRAM-SHA-256 认证

1. 下载安装apache-zookeeper-3.9.2 配置 \conf\zoo.cfg # The number of milliseconds of each tick tickTime2000 # The number of ticks that the initial # synchronization phase can take initLimit10 # The number of ticks that can pass between # sending a requ…

什么是FUSE用户态文件系统

零. 文件系统 1. 为什么要有文件系统 文件系统是操作系统中管理文件和目录的一种机制。它提供了组织、存储、检索和更新文件的方法&#xff0c;主要如下&#xff1a; 数据组织&#xff1a;文件系统将数据组织成文件和目录&#xff0c;使用户能够更方便地管理和查找文件。每个…

HarmonyOS 5.0应用开发——音频播放组件的封装

【高心星出品】 文章目录 音频播放组件的封装开发步骤封装类代码测试代码 音频播放组件的封装 鸿蒙中提供了AVPlayer来实现音频播放的功能&#xff0c;播放的全流程包含&#xff1a;创建AVPlayer&#xff0c;设置播放资源&#xff0c;设置播放参数&#xff08;音量/倍速/焦点模…

(10)文件操作

1. 文件指针的概念和定义 在 C 语言中&#xff0c;文件指针是一种特殊的指针&#xff0c;用于指向一个文件结构体。这个结构体包含了文件的各种信息&#xff0c;如文件名、文件状态、当前文件位置指针等。通过文件指针&#xff0c;程序可以对文件进行各种操作。 文件指针的定…

KPRCB结构之ReadySummary和DispatcherReadyListHead

ReadySummary: Uint4B DispatcherReadyListHead : [32] _LIST_ENTRY 请参考 _KTHREAD *__fastcall KiSelectReadyThread(ULONG LowPriority, _KPRCB *Prcb)

【染色时间】

题目 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int,int> PII; const int N 510; int dx[] {0,0,-1,1}, dy[] {-1,1,0,0}; int d[N][N], w[N][N]; int n, m; void bfs() {memset(d, 0x3f, sizeof d);q…

了解神经网络中的激活函数

一、激活函数的特征 非线性&#xff0c;激活函数必须是非线性函数。可微性&#xff0c;训练网络模型时&#xff0c;基于梯度的模型最优化方法要求激活函数必须是可导的。单调性&#xff0c;单调递增或单调递减&#xff0c;单调函数保证模型的简单。隐藏层一般需要使用激活函数…

Apache Dubbo (RPC框架)

本文参考官方文档&#xff1a;Apache Dubbo 1. Dubbo 简介与核心功能 Apache Dubbo 是一个高性能、轻量级的开源Java RPC框架&#xff0c;用于快速开发高性能的服务。它提供了服务的注册、发现、调用、监控等核心功能&#xff0c;以及负载均衡、流量控制、服务降级等高级功能。…

利用钉钉与金蝶云星空进行付款单自动化集成

钉钉数据集成到金蝶云星空&#xff1a;付款申请单下推生成付款单的技术实现 在企业日常运营中&#xff0c;数据的高效流转和准确处理是业务顺利进行的关键。本文将分享一个具体的系统对接集成案例&#xff1a;如何将钉钉平台上的付款申请单&#xff0c;通过轻易云数据集成平台…

前端八股文第七篇

61. React 中有对状态管理做进一步封装吗 在 React 中&#xff0c;除了可以使用原生的状态管理方式&#xff08;即使用组件的 state 属性&#xff09;外&#xff0c;还有一些第三方库对状态管理进行了进一步封装&#xff0c;以提供更强大和便捷的状态管理功能。其中最常见的是…

青少年编程能力等级测评CPA Python编程(一级)

青少年编程能力等级测评CPA Python编程(一级) &#xff08;考试时间90分钟&#xff0c;满分100分&#xff09; 一、单项选择题&#xff08;共20题&#xff0c;每题3.5分&#xff0c;共70分&#xff09; 下列语句的输出结果是&#xff08; &#xff09;。 print(35*2) A&a…

JavaScript语法基础(函数,对象,常用类Array,String,Math和Date)【超详细!!!新手入!!!】

一、函数 1、函数的定义 函数指的是一段可被重复调用的代码块。函数与变量不同&#xff0c;需要先定义再调用。 定义函数的语法格式为&#xff1a; function 函数名&#xff08;参数1&#xff0c;参数2&#xff0c;...&#xff09; { 语句&#xff1b; …

每日OJ题_牛客_NC6二叉树中的最大路径和_树形DP_C++_Java

目录 牛客_NC6二叉树中的最大路径和_树形DP 题目解析 C代码 Java代码 牛客_NC6二叉树中的最大路径和_树形DP 二叉树中的最大路径和_牛客题霸_牛客网 (nowcoder.com) 描述&#xff1a; 二叉树里面的路径被定义为:从该树的任意节点出发&#xff0c;经过父>子或者子>…