【LeetCode】完全平方数 [M](数学)

166 篇文章 0 订阅

279. 完全平方数 - 力扣(LeetCode)

一、题目

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

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

输入:n = 12

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

示例 2:​​​​​​​

输入:n = 13

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

提示:

  • 1 <= n <= 104

二、代码

class Solution {
    public int numSquares(int n) {
        int rest = n;
		// 规律四
		while (rest % 4 == 0) {
			rest /= 4;
		}
		// 规律三和规律四
		if (rest % 8 == 7) {
			return 4;
		}
		// 规律二
		int f = (int) Math.sqrt(n);
		if (f * f == n) {
			return 1;
		}
		// 执行到这里,就排除了1个和4个的情况
		// 先去判断是不是2个,就尝试所有可能的左部分,进而再去验证剩余的右部分是不是完全平方数,找到了一种可行的方案就说明是2个
		// first:尝试其中的一个平方数为first * first
		for (int first = 1; first * first <= n; first++) {
			// 将剩余的数(n - first * first)开平方
			int second = (int) Math.sqrt(n - first * first);
			// 看两部分数first * first和second * second加和是否能得到n,能得到就说明由2个完全平方数组成,返回2
			if (first * first + second * second == n) {
				return 2;
			}
		}
		// 如果执行到这里,就只剩下3个的情况了,直接返回3
		return 3;
    }
}

三、解题思路 

四平方和定理:

规律一:个数不超过4

规律二:如果这个数可以直接开平方,那么就直接返回1个

规律三:任何数 % 8 == 7,那么一定是4个

规律四:任何数消去4的因子之后,剩下rest,如果rest % 8 == 7,那么一定是4个

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问。该问给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问的两种方法。如果你还有其他相关问,请

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值