leetcode-279

108 阅读1分钟

题目描述:具体描述见原题。简单来说就是使用尽量少的完全平方数求和,得到给定数值。每个完全平方数可以重复使用。

解题思路:考虑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
}

补充说明:如果想不明白更新策略,可以单步调式一下,记录所有计算过程。每天都很困,真是要命。