题目描述:具体描述见原题。简单来说就是使用尽量少的完全平方数求和,得到给定数值。每个完全平方数可以重复使用。
解题思路:考虑dp。首先用数组ele升序保存小于给定数值所有完全平方数,其次用数组res保存返回值,res[i]代表数值i最少由多少个完全平方数求和得到,最后是更新策略,依次引入数组中完全平方数,res[i] = min(res[i], res[i-ele[k]])。具体过程见代码。
具体代码:
func numSquares(n int) int {
ele := make([]int, 0)
for i := 1; i*i <= n; i++ {
ele = append(ele, i*i) // 保存每个小于n的完全平方数的数组
}
res := make([]int, n+1)
for i := 1; i < len(res); i++ {
res[i] = math.MaxInt32 // 初始化res,默认每个元素均由很多个完全平方数组成。其实这里也可以res[i] = i,默认每个元素均由i个1组成
}
for _, e := range ele{
for i := e; i < len(res); i++ {
res[i] = min(res[i], res[i-e]+1) // 更新res[i]。每引入一个新的完全平方数,就更新res[i]
}
}
return res[n]
}
func min(x, y int) int {
if x > y {
return y
}
return x
}
补充说明:如果想不明白更新策略,可以单步调式一下,记录所有计算过程。每天都很困,真是要命。