Leetcode 279. 完全平方数 记忆化搜索

地址 https://leetcode-cn.com/problems/perfect-squares/

给你一个整数 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 <= 10^4

解答
最暴力的做法就是制作一个完全平方数的表,然后各种尝试将给出的n 组成完全平方数的组合,找出最少的使用组合。
我们可以使用一个数组dp[]记录某个数的最少平方数的组合数
那么dp[n] 就是n减去某个完全平方数x的组合数加1
比如 dp[12] = dp[4]+dp[8] = dp[4]+dp[4]+dp[4]; dp[4]=1; 所以dp[8]=2; dp[12]=3;
dp[13] = dp[4]+dp[9]; dp[4]=1; dp[9]=1; dp[13]=2
代码如下

class Solution {
public:
	int arr[150];
	int dp[10010];
	//初始化出 完全平方数
	void init() {
		for (int i = 0; i < 150; i++) {
			arr[i] = i * i;
		}
		memset(dp, 0x3f, sizeof dp);
	}
	
	int solve(int n) {
		int& ans = dp[n];
		if(ans != 0x3f3f3f3f) {return ans;}
		for (int i = 1; i <= 100; i++) {
			if (arr[i] > n) break;
			if (n == arr[i]) { ans = 1; return ans; }
			ans = min(ans, solve(n - arr[i]) + 1);
		}

		return ans;
	}

	int numSquares(int n) {
		init();
		int ans = solve(n);
		return ans;
	}
};

我的视频题解空间

posted on 2022-01-28 14:41  itdef  阅读(78)  评论(0编辑  收藏  举报

导航