@LIUHUAN
2020-06-28T01:44:51.000000Z
字数 1705
阅读 1088
algorithm
int numSquares(int n) { return dfs(n); }int dfs(int n) {if (n <= 0) {return 0;}if (n == 1) {return 1;}int x = sqrt(n);// 最大的枚举值,最小的从1开始int c = INT_MAX;for (int i = 1; i <= x; i++) {auto y = dfs(n - i * i);c = min(c, y + 1);}return c;}
map,也可以用数组,来缓存已经计算完的数据。对于已经获取的数据直接返回结果。map来保存,例如map[3]=3,下次计算的时候可以直接使用
int numSquares(int n) { return dfs(n); }int dfs(int n) {if (n <= 0) {return 0;}if (n == 1) {return 1;}if (cache.find(n) != cache.end()) {// 已计算return cache[n];}int x = sqrt(n);int c = INT_MAX;for (int i = 1; i <= x; i++) {auto y = dfs(n - i * i);c = min(c, y + 1);}cache[n] = c;//缓存结果return c;}
int numSquares(int n) { return dyp(n); }int dyp(int n) {if (n <= 0)return 0;if (n == 1) {return 1;}vector<int> dp(n + 1, INT_MAX);dp[1] = 1;dp[0] = 0;for (int i = 2; i <= n; i++) {for (int j = sqrt(i); j >= 1; j--) {dp[i] = min(dp[i], dp[i - j * j] + 1);}}return dp[n];}