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

LeetCode刷题记录----279.完全平方数(Medium)

2025/9/20

题目(Medium):

279.完全平方数


解题思路:

模式识别:对于每个数而言,我们可以感觉到它是由比它更小的数的相加,而每个数也有相应的最小完全平方数。因此子问题和当前问题有同样的结构,可以用动态规划的思路。

思路:

考虑动态转移数组 dp[i] 的含义:当前数字 i 最少需要多少个数的平方累加得到

而对于每个数字 i 而言,它一定可以找到比它更小的数字 j ∈ [1, 根号下i] 范围的数字的平方累加起来。  因此,我们可以枚举这个范围内的数字,找到其中累加数字中对应的dp[i - j*j]的最小值,作为当前数字的dp的一部分。

找到之后让 dp[i] = minDp + 1;(+1是因为至少还要加上这个数字本身)

具体代码如下:

public class Solution {public int NumSquares(int n) {int sqrtN = (int)Math.Sqrt(n);if(n == sqrtN * sqrtN)return 1;int[] dp = new int[n+1];//遍历到每一个数字for(int i = 1; i <= n; i++){int min = int.MaxValue;//枚举从[1,根号下i]这段位置的数值需要累加的平方数的数量for(int j = 1; j*j <= i; j++){min = Math.Min(min, dp[i - j*j]);}dp[i] = min + 1;}return dp[n];}
}

时间复杂度:

空间复杂度:O(n)


优化思路:

数学上严格证明了每个数都一定可以表示为四个数格子的平方之和。因此上界确定了是4。

同时也严格证明了

如果是两个正整数的:我们直接从1开始枚举到n,看看能不能找到另一个正整数

如果是一个正整数,那就直接说明它可以被开方为正整数

如果以上情况都不是,则为三个正整数

具体代码如下:(来自LeetCode官方题解,这里只做了搬运)

class Solution {
public:// 判断是否为完全平方数bool isPerfectSquare(int x) {int y = sqrt(x);return y * y == x;}// 判断是否能表示为 4^k*(8m+7)bool checkAnswer4(int x) {while (x % 4 == 0) {x /= 4;}return x % 8 == 7;}int numSquares(int n) {if (isPerfectSquare(n)) {return 1;}if (checkAnswer4(n)) {return 4;}for (int i = 1; i * i <= n; i++) {int j = n - i * i;if (isPerfectSquare(j)) {return 2;}}return 3;}
};


总结:

①对于数的相加,你永远可以相信枚举的作用。没有思路的时候就去往枚举考虑先

②理清思路后,我们可以通过枚举每个数字,直接计算其平方以作为目标数组的加数来进行相应调整。

http://www.dtcms.com/a/393078.html

相关文章:

  • H7-TOOL的250M示波器模组采集CANFD标准波形效果,开口逻辑0,闭口逻辑1
  • 打工人日报#20250920
  • 详解C/C++内存管理
  • SSM(springboot部分)
  • C++ std:string和Qt的QString有哪些差异?
  • FunASR开源项目实战:解锁语音识别新姿势
  • (华为杯)数学建模比赛编程助手
  • 通义千问对postgresql wire协议的连接和执行SQL过程的解释
  • 钣金折弯机被远程锁机了怎么办
  • 基于陌讯AIGC检测算法的高性能部署实践:FastAPI与多进程并发设计详解
  • 群晖 NAS 远程访问痛点解决:神卓 N600 公网 IP 盒实战体验
  • JavaWeb之HttpServletRequest与HttpServletResponse详解及快递管理系统实践
  • Git详细介绍
  • 大话计算机网络(上)
  • JVM方法调用机制深度解析:从aload_1到invokevirtual的完整旅程
  • STM32CubeIDE学习——安装
  • 追觅宣布进军手机市场,已经白热化的手机赛道追觅优势何在?
  • AI智能体开发工作流的成功案例分享及思路
  • 【算法基础】String、Hash 与 Stack
  • 使用springboot开发一个宿舍管理系统练习项目
  • 像素版推箱子游戏
  • 2025年CSP-J认证 普及组初赛真题解析 CCF信息学奥赛C++ 中小学初级组 第一轮真题-选择题解析
  • 【精品资料鉴赏】121页可编辑PPT详解医药集团合规管控规划方案
  • Linux用户权限与进程管理深度解析
  • [数据结构] 反射,枚举与lambda表达式
  • 奇异值:数据科学的数学基石与应用核心
  • Python 2025:安全编程与漏洞防范实战指南
  • ​​[硬件电路-286]:高速轨到轨比较器TLV3603DCKR 功能概述与管脚定义
  • CAR 细胞疗法:破解自身免疫性疾病的 “免疫纠错” 新路径
  • FreeRTOS实战指南 — 5 多任务系统实现流程