279 Perfect Squares 完美平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...) 使得他们的和等于 n。你需要让平方数的个数最少。
比如 n = 12,返回 3 ,因为 12 = 4 + 4 + 4 ; 给定 n = 13,返回 2 ,因为 13 = 4 + 9。
详见:https://leetcode.com/problems/perfect-squares/description/
Java实现:
方法一:递归实现
1 2 3 4 5 6 7 8 9 10 11 | class Solution { public int numSquares( int n) { int res = n, num = 2 ; while (num * num <= n) { int a = n / (num * num), b = n % (num * num); res = Math.min(res, a + numSquares(b)); ++num; } return res; } } |
方法二:动态规划
如果一个数x可以表示为一个任意数a加上一个平方数bxb,也就是x=a+bxb,那么能组成这个数x最少的平方数个数,就是能组成a最少的平方数个数加上1(因为b*b已经是平方数了)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Solution { public int numSquares( int n) { int [] dp = new int [n+ 1 ]; // 将所有非平方数的结果置最大,保证之后比较的时候不被选中 Arrays.fill(dp, Integer.MAX_VALUE); // 将所有平方数的结果置1 for ( int i = 0 ; i * i <= n; i++){ dp[i * i] = 1 ; } // 从小到大找任意数a for ( int a = 0 ; a <= n; a++){ // 从小到大找平方数bxb for ( int b = 0 ; a + b * b <= n; b++){ // 因为a+b*b可能本身就是平方数,所以我们要取两个中较小的 dp[a + b * b] = Math.min(dp[a] + 1 , dp[a + b * b]); } } return dp[n]; } } |
C++实现:
方法一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Solution { public : int numSquares( int n) { while (n%4==0) { n/=4; } if (n%8==7) { return 4; } for ( int a=0;a*a<=n;++a) { int b= sqrt (n-a*a); if (a*a+b*b==n) { return !!a+!!b; } } return 3; } }; |
方法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Solution { public : int numSquares( int n) { vector< int > dp(n+1,INT_MAX); dp[0]=0; for ( int i=0;i<=n;++i) { for ( int j=1;i+j*j<=n;++j) { dp[i+j*j]=min(dp[i+j*j],dp[i]+1); } } return dp.back(); } }; |
方法三:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Solution { public : int numSquares( int n) { vector< int > dp(1, 0); while (dp.size() <= n) { int m = dp.size(), val = INT_MAX; for ( int i = 1; i * i <= m; ++i) { val = min(val, dp[m - i * i] + 1); } dp.push_back(val); } return dp.back(); } }; |
参考:https://www.cnblogs.com/grandyang/p/4800552.html
标签:
LeetCode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 用 C# 插值字符串处理器写一个 sscanf
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!