原题链接:完全平方数
个人解法
思路:
暴搜+剪枝,直接从n的开平方到1枚举,不断拆分n,知道n为0,此时记录最小值。当拆分的数已经大于记录的答案,既可以直接返回来剪枝。
时间复杂度: O ( n n ) O(n\sqrt{n}) O(nn)
代码:
class Solution {
public:
int ans = 0x3f3f3f3f;
void dfs(int n, int cnt) {
if(cnt >= ans) return;
if(n == 0) {
ans = min(ans, cnt);
return;
}
for(int i = sqrt(n); i >= 1;i --) {
dfs(n - i * i, cnt + 1);
}
}
int numSquares(int n) {
dfs(n, 0);
return ans;
}
};