news 2026/2/28 4:19:58

Leetcode279:完全平方数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Leetcode279:完全平方数

给你一个整数n,返回和为n的完全平方数的最少数量

完全平方数是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,14916都是完全平方数,而311不是。

示例 1:

输入:n =12输出:3解释:12 = 4 + 4 + 4

示例 2:

输入:n =13输出:2解释:13 = 4 + 9

提示:

  • 1 <= n <= 10^4

直接上代码,实在看不懂就学会纯暴力解就行了,面试没问题的:

class Solution { /** * 纯暴力解 * @param n * @return */ public static int numSquares1(int n) { /** * 最差的情况n = 1 * 1+ 1*1 ....一共n个1*1 * 我们从2开始试,看看能不能让结果变的更小 */ int res = n, num = 2; while(num * num <= n) { /** * 这句比较难理解,我们举个栗子,假设n=17 * a = 17 / (2 * 2) = 4 b = 17 % (2 * 2) = 1 * 是不是太简单了,我们举个复杂点的例子 * 假设n = 99 * a = 99/(2*2)=24 b = 99 % (2*2)= 3 * 这里我们是想要这样一个一个结果 * n = a * (num * num) + b * res=a*num的平方(a个)+b能分成多少个 */ int a = n /(num * num), b = n % (num * num); res = Math.min(res, a + numSquares(b)); num ++; } return res; } /** i=1,result=1 i=2,result=2 i=3,result=3 i=4,result=1 i=5,result=2 i=6,result=3 i=7,result=4 i=8,result=2 i=9,result=1 i=10,result=2 i=11,result=3 i=12,result=3 i=13,result=2 i=14,result=3 i=15,result=4 i=16,result=1 i=17,result=2 i=18,result=2 i=19,result=3 i=20,result=2 i=21,result=3 i=22,result=3 i=23,result=4 i=24,result=3 i=25,result=1 i=26,result=2 i=27,result=3 i=28,result=4 i=29,result=2 i=30,result=3 i=31,result=4 i=32,result=2 i=33,result=3 i=34,result=2 i=35,result=3 i=36,result=1 i=37,result=2 i=38,result=3 i=39,result=4 i=40,result=2 i=41,result=2 i=42,result=3 i=43,result=3 i=44,result=3 i=45,result=2 i=46,result=3 i=47,result=4 i=48,result=3 i=49,result=1 i=50,result=2 i=51,result=3 i=52,result=2 i=53,result=2 i=54,result=3 i=55,result=4 i=56,result=3 i=57,result=3 i=58,result=2 i=59,result=3 i=60,result=4 i=61,result=2 i=62,result=3 i=63,result=4 i=64,result=1 i=65,result=2 i=66,result=3 i=67,result=3 i=68,result=2 i=69,result=3 i=70,result=3 i=71,result=4 i=72,result=2 i=73,result=2 i=74,result=2 i=75,result=3 i=76,result=3 i=77,result=3 i=78,result=3 i=79,result=4 i=80,result=2 i=81,result=1 i=82,result=2 i=83,result=3 i=84,result=3 i=85,result=2 i=86,result=3 i=87,result=4 i=88,result=3 i=89,result=2 i=90,result=2 i=91,result=3 i=92,result=4 i=93,result=3 i=94,result=3 i=95,result=4 i=96,result=3 i=97,result=2 i=98,result=2 i=99,result=3 *总结一下规律, * (1) 不管对于什么数来说,一共可以分解为4个以内 * (2) 出现一个的时候很容易求,就是sqrt(n) * sqrt(n) = n; * (3) n % 8 == 7的时候一定是4 * (4) 消去4的因子后%8==7一定是四个 */ /** * 根据暴力解找的规律 * @param n * @return */ public static int numSquares2(int n) { int rest = n; /** * 消去4的因子 */ while(rest % 4 == 0) { rest = rest / 4; } /** * 模8==7就是四个 */ if(rest % 8 == 7) { return 4; } /** * 如果刚好是某个数的平方,是1个 */ int f = (int)Math.sqrt(n); if(f * f == n) { return 1; } /** * 如果上面两种都不是,就肯定是2或者3,尝试一下 * 先设置为最大3 */ int res = 3; for(int first = 1; first * first <= n; first ++) { int left = n - first * first; int sqrtLeft = (int)Math.sqrt(left); if(sqrtLeft * sqrtLeft == left) { res = 2; break; } } return res; } /** * 数学解:四平方和定理 * @param n * @return */ public static int numSquares(int n) { /** * 规律4,消除4的因子 */ while (n % 4 == 0) { n = n / 4; } if(n % 8 == 7) { return 4; } for(int a = 0; a * a <= n; a++) { /** * b是剩余部分的平方根 */ int b = (int)Math.sqrt(n - a * a); /** * 如果两个数的平方和等于n,分为两种情况 * 1.如果a和b某一个为0,则另外一个数的平方等于n,这种的答案是1 * 2.如果a和b都不为0,则n=a*a + b*b也就是答案为2 */ if(a * a + b * b == n) { return a == 0 || b == 0? 1 : 2; } } /** * 最多有1,2,3,4四种可能性,1,2,4都每返回,那只能是3了 */ return 3; } }

运行结果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/21 12:21:05

测试必知必会的Mock数据方法

Mock数据的含义 那么Mock数据是什么意思呢 首先Mock这个英文单词有模拟的意思&#xff0c;模拟数据通俗的理解就是构造假数据&#xff0c;即Mock数据就是通过构造假数据来达到测试的目的&#xff0c;它广泛运用于功能测试、接口测试、单元测试 在功能测试中&#xff0c;可以…

作者头像 李华
网站建设 2026/2/28 2:07:45

德国连锁超市Lidl数字标牌系统启动失败引发关注

德国知名连锁超市Lidl以其低价商品和"Lidl中央通道"的随机商品而闻名&#xff0c;如今又因为一个意外的技术故障成为焦点。一位敏锐的读者发现&#xff0c;某家Lidl分店的数字标牌出现了启动失败的问题。从屏幕显示的内容来看&#xff0c;这套廉价的数字标牌系统无法…

作者头像 李华
网站建设 2026/2/27 15:30:37

【游戏推荐】火山的女儿(Volcano Princess)免安装中文版

类型&#xff1a; 小游戏, 生活模拟, 角色扮演 链接&#xff1a;https://pan.quark.cn/s/22c9a9bf38aa 游戏简介 欢迎来到「火山的女儿」&#xff01; 《火山的女儿》是一款多结局美少女模拟养成游戏&#xff0c;在游戏中&#xff0c;玩家将在剑与魔法、炼金术盛行的火山国抚…

作者头像 李华
网站建设 2026/2/27 10:52:47

优化大数据领域数据一致性的流程与方法

优化大数据领域数据一致性的流程与方法&#xff1a;从理论到实战的全链路解决方案 在大数据时代&#xff0c;数据一致性是所有数据驱动业务的“基石”——如果用户行为数据重复会导致推荐系统“过度推送”&#xff0c;交易数据丢失会引发财务对账失败&#xff0c;维度表与事实表…

作者头像 李华
网站建设 2026/2/24 16:31:59

数据产品技术债务:大数据系统维护与重构策略

数据产品技术债务&#xff1a;大数据系统维护与重构策略 关键词&#xff1a;技术债务、大数据系统、系统维护、架构重构、数据产品生命周期 摘要&#xff1a;本文以“数据产品技术债务”为核心&#xff0c;结合大数据系统的特点&#xff0c;用通俗易懂的语言解释技术债务的本质…

作者头像 李华