news 2026/4/16 18:57:28

279.完全平方数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
279.完全平方数

题目描述

题解一(动态规划)

思路

代码

classSolution{publicintnumSquares(intn){// dp[i] 表示和为 i 的完全平方数的最少数量int[]dp=newint[n+1];// 初始化为最大值,方便后续求最小值Arrays.fill(dp,Integer.MAX_VALUE);//-----------------------//解析1:Arrays.fill()方法///----------------------// base case:和为 0 的完全平方数数量为 0dp[0]=0;// 遍历所有需要求的数字 ifor(inti=1;i<=n;i++){// 尝试减去所有可能的完全平方数 j*j (1, 4, 9, 16...)for(intj=1;j*j<=i;j++){// 状态转移方程dp[i]=Math.min(dp[i],dp[i-j*j]+1);}}returndp[n];}}

解析1:Arrays.fill()方法

将一个数组中的所有元素(或指定范围的元素),快速统一替换为你指定的某一个值

//1.把 arr 里的所有元素都变成 9Arrays.fill(arr,9);//2.从索引 1 开始(包含),到索引 4 结束(不包含索引 4)//即把arr数组中[1,4)索引对应的元素替换为7Arrays.fill(arr,1,4,7);

复杂度分析

  • 时间复杂度:O(nn)O(n \sqrt{n})O(nn)。外层循环执行nnn次,内层循环对于每个iii,最多执行i\sqrt{i}i次,因此总复杂度为O(nn)O(n \sqrt{n})O(nn)
  • 空间复杂度:O(n)O(n)O(n)。我们需要一个长度为n+1n + 1n+1的 dp 数组来存储中间状态

题解二(数学)(最优解法)

代码

classSolution{publicintnumSquares(intn){// 判断是否为完全平方数的辅助方法if(isPerfectSquare(n)){return1;}// 判断是否满足 4^a * (8b + 7)// 这一步是消去式子中的 4^a,也就是不断将 n 除以 4inttemp=n;while(temp%4==0){temp/=4;}// 如果消去 4^a 后,除以 8 的余数是 7,则必定是由 4 个平方数组成if(temp%8==7){return4;}// 判断是否能由 2 个平方数组成 (n = a^2 + b^2)for(inti=1;i*i<=n;i++){intj=n-i*i;if(isPerfectSquare(j)){return2;}}// 如果不是 1, 4, 2,那就只能是 3 了return3;}// 辅助方法:判断一个数是否为完全平方数privatebooleanisPerfectSquare(intx){inty=(int)Math.sqrt(x);returny*y==x;}}

复杂度分析

  • 时间复杂度:O(n)O(\sqrt{n})O(n)
    • 判断答案是否为 1 耗时O(1)O(1)O(1)
    • 判断答案是否为 4 涉及一个 while 循环(除以 4),最多执行log⁡4(n)\log_4(n)log4(n)次,耗时O(log⁡n)O(\log n)O(logn)
    • 判断答案是否为 2 涉及一个 for 循环,循环变量 i 最大到n\sqrt{n}n,内部判断耗时O(1)O(1)O(1),总共耗时O(n)O(\sqrt{n})O(n)
    • 综合起来,最高阶的时间复杂度为O(n)O(\sqrt{n})O(n)
  • 空间复杂度:O(1)O(1)O(1)。只使用了几个整型变量,不需要额外的数组或集合来存储中间状态(相比于动态规划省下了O(n)O(n)O(n)的内存空间)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 18:53:36

Proteus 8.13 仿真 Arduino MEGA 2560 读取 GPS 数据:手把手教你解析 NMEA 协议

Proteus 8.13 仿真 Arduino MEGA 2560 读取 GPS 数据&#xff1a;手把手教你解析 NMEA 协议 在物联网和嵌入式开发领域&#xff0c;GPS模块的应用越来越广泛。但对于开发者来说&#xff0c;仅仅知道如何连接模块是远远不够的&#xff0c;真正有价值的是理解GPS数据通信的底层原…

作者头像 李华
网站建设 2026/4/16 18:50:13

JDspyder:如何用Python自动化脚本提升京东抢购成功率90%

JDspyder&#xff1a;如何用Python自动化脚本提升京东抢购成功率90% 【免费下载链接】JDspyder 京东预约&抢购脚本&#xff0c;可以自定义商品链接 项目地址: https://gitcode.com/gh_mirrors/jd/JDspyder 在电商促销活动中&#xff0c;热门商品往往在几秒内售罄&am…

作者头像 李华
网站建设 2026/4/16 18:49:12

告别重复劳动:千峰办公助手自动任务功能的办公自动化实践

在现代化的办公环境中&#xff0c;重复性任务仍然是消耗人力资源的主要因素之一。 数据录入、格式整理、文件归档、报表生成……这些看似简单的操作&#xff0c;在日复一日的积累中占据了工作者大量的时间和精力。 办公自动化的概念应运而生&#xff0c;旨在通过技术手段替代…

作者头像 李华
网站建设 2026/4/16 18:39:43

【STM32实战指南】SPI与8080双模式驱动OLED显示技术解析

1. OLED显示技术基础 OLED&#xff08;有机发光二极管&#xff09;作为新一代显示技术&#xff0c;凭借自发光特性在嵌入式领域广受欢迎。与LCD不同&#xff0c;OLED每个像素都能独立发光&#xff0c;这使得它具备以下天然优势&#xff1a; 超高对比度&#xff1a;黑色区域完全…

作者头像 李华
网站建设 2026/4/16 18:36:42

SpringBoot集成LangChain4j:构建企业级AI流式对话服务

1. 为什么企业需要流式对话服务 最近两年AI对话应用爆发式增长&#xff0c;但很多企业级应用还在使用传统的"一问一答"模式。想象一下用户问了个复杂问题&#xff0c;盯着空白页面等十几秒才看到完整回复&#xff0c;这种体验有多糟糕。流式对话就像打开水龙头&#…

作者头像 李华
网站建设 2026/4/16 18:36:37

【ChArUco Marker】从检测到姿态估计:OpenCV实战全解析

1. ChArUco Marker基础概念与核心价值 ChArUco&#xff08;Chessboard ArUco&#xff09;标记是计算机视觉领域中用于高精度标定和姿态估计的混合标记系统。我第一次接触这个技术是在一个工业机器人视觉引导项目中&#xff0c;当时需要解决传统棋盘格标定板易受遮挡影响的问题…

作者头像 李华