当前位置: 首页 > news >正文

Swift 解法详解:LeetCode 367《有效的完全平方数》

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码拆解
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

判断一个数是不是完全平方数,看似简单,但题目要求我们不能用 sqrt 这样的现成函数。也就是说,我们得自己想办法去模拟“开平方”的过程。这种题很有意思,不光能训练我们对二分查找的掌握,还能让我们思考数字在计算机里的表现方式。

描述

题目给了一个正整数 num,问它是不是某个整数的平方。

  • 如果是,返回 true
  • 如果不是,返回 false

完全平方数:就是能写成 a * a 形式的数,比如:

  • 16 = 4 * 4
  • 9 = 3 * 3
  • 25 = 5 * 5

但像 14 就不行,它介于 3² 和 4² 之间,平方根不是整数。

输入输出例子:

输入:num = 16
输出:true输入:num = 14
输出:false

题解答案

一个直接的办法是从 1 开始,一个个平方,看是不是等于 num。但这样效率太低,尤其是 num 最大能到 2^31 - 1(20 多亿)。

更高效的方式是用 二分查找

  1. 搜索范围是 [1, num]

  2. 每次取中点 mid,计算 mid * mid

    • 如果等于 num,那就是完全平方数。
    • 如果比 num 大,说明平方根在左半边。
    • 如果比 num 小,说明平方根在右半边。
  3. 一直缩小范围,直到找到答案。

题解代码分析

下面是 Swift 的实现:

import Foundationclass Solution {func isPerfectSquare(_ num: Int) -> Bool {if num < 2 {return true}var left = 1var right = num / 2  // 平方根不可能超过 num/2 (除非 num=1)while left <= right {let mid = left + (right - left) / 2let square = mid * midif square == num {return true} else if square < num {left = mid + 1} else {right = mid - 1}}return false}
}// MARK: - Demo 演示
let solution = Solution()
print(solution.isPerfectSquare(16))  // true
print(solution.isPerfectSquare(14))  // false
print(solution.isPerfectSquare(1))   // true
print(solution.isPerfectSquare(808201)) // true (因为 899 * 899 = 808201)

代码拆解

  1. 特殊情况:如果 num < 2,比如 0 或 1,直接返回 true

  2. 二分边界

    • 左边界 left = 1
    • 右边界 right = num / 2,因为平方根不会超过 num/2(除了 num=1)。
  3. 二分逻辑

    • 每次计算 mid * mid
    • 如果等于 num,直接返回 true
    • 如果小于 num,收缩到右区间。
    • 如果大于 num,收缩到左区间。
  4. 返回结果:没找到说明不是完全平方数,返回 false

示例测试及结果

运行上面 Demo,得到结果:

true
false
true
true

更丰富的测试:

print(solution.isPerfectSquare(25)) // true
print(solution.isPerfectSquare(26)) // false
print(solution.isPerfectSquare(100)) // true
print(solution.isPerfectSquare(2147395600)) // true (46340 * 46340)
print(solution.isPerfectSquare(2147483647)) // false (最大 int,不是平方数)

时间复杂度

  • 二分查找每次把搜索区间减半,最多执行 O(log n) 次比较。
  • 每次计算 mid * mid 是 O(1)。
  • 所以整体复杂度是 O(log n)

空间复杂度

  • 只用了常数级别的变量 leftrightmidsquare
  • 空间复杂度是 O(1)

总结

这道题其实就是把“数学直觉”转化成“计算机算法”的过程:

  • 我们人眼可以轻松判断一个数是不是完全平方数,比如看到 16 就知道是 4²。
  • 但计算机不能直接用 sqrt,就需要用二分查找模拟“开方”的过程。

实际应用场景里,这种“判断平方数”的逻辑可能用在:

  • 图像处理里判断像素矩阵是不是正方形。
  • 数字加密里验证一些平方相关的条件。
  • 游戏开发中做网格计算,判断一个范围是不是可以正好铺满。
http://www.xdnf.cn/news/1399177.html

相关文章:

  • Kafka入门
  • 开源 C++ QT Widget 开发(八)网络--Http文件下载
  • 《微服务架构从故障频发到自愈可控的实战突围方案》
  • CSDN博客语法(不常用但有用)
  • 谷歌 “Nano Banana“ 深度解析:AI 图像的未来是精准编辑,而非从零生成
  • ⚡ Linux find 命令参数详解
  • MySQL基础理解入门
  • 嵌入式硬件电路分析---AD采集电路
  • Spring Boot 自动配置原理深度解析:从启动流程到监听机制
  • 【Java EE进阶 --- SpringBoot】Spring Web MVC(Spring MVC)(二)
  • 设计模式之代理模式!
  • 深度学习基础:前馈网络、反向传播与梯度问题
  • 基于IEC61499开放自动化PLC数据储存方案
  • 在 WSL2-NVIDIA-Workbench 中安装Anaconda、CUDA 13.0、cuDNN 9.12 及 PyTorch(含完整环境验证)
  • 第 8 篇:量化交易之tradeUI和webserverUI 区别?
  • 系统分析师考试大纲新旧版本深度分析与备考策略
  • 捡捡java——2、基础07
  • 开发指南136-设置零值不显示
  • vue中的与,或,非
  • Ansible 核心运维场景落地:YUM 仓库、SSH 公钥、固定 IP 配置技巧
  • [Windows] 剪映国际版CapCut 6.7.0 视频编辑处理,免费使用素材和滤镜
  • 拼团小程序源码分享拼团余额提现小程序定制教程开发源码二开
  • LeetCode 136. 只出现一次的数字
  • [论文阅读] 人工智能 + 软件工程 | 从“法律条文”到“Gherkin脚本”:Claude与Llama谁更懂合规开发?
  • 普蓝自研AutoTrack-4X导航套件平台适配高校机器人实操应用
  • k8s(自写)
  • docker安装Prometheus和Grafana 监控界面
  • 为多种业态注入智能化发展新活力的智慧地产开源了
  • 从Java全栈开发视角看企业级应用架构设计与实践
  • C++转置正方形矩阵