LeetCode: 279. 完全平方数
这道题如果知道数学定理之后,相当于告诉你:
任何正整数都可以拆分成不超过4个数的平方和 —> 答案只可能是1,2,3,4
如果一个数最少可以拆成4个数的平方和,则这个数还满足 n = (4^a)*(8b+7) —> 因此可以先看这个数是否满足上述公式,如果不满足,答案就是1,2,3了
如果这个数本来就是某个数的平方,那么答案就是1,否则答案就只剩2,3了
如果答案是2,即n=a2+b2,那么我们可以枚举a,来验证,如果验证通过则答案是2
只能是3
数学定理
func numSquares(n int) int {
// 数学结论
// 4 ^ k (8 * m + 7) == n 满足这条式子 >> 说明有 4 个平方数组成
for n % 4 == 0{
n /= 4
}
if n % 8 == 7 {
return 4
}
// 等于自己开根的平方
if int(math.Sqrt(float64(n))) * int(math.Sqrt(float64(n))) == n {
return 1
}
for i := 1; i * i < n; i++ {
temp := int(math.Sqrt(float64(n - i * i))) * int(math.Sqrt(float64(n - i * i)))
if temp + i * i == n {
return 2
}
}
return 3
}
还有一种解法 >> 利用 set 贪心可以