【LeetCode】每日一题--279.完全平方数【DP】

1.题目链接
点击这里!

2.解题思路
DP的思想,站在某个状态考虑他可能由哪些状态推出:对于n,他可能由 (n - 一个完全平方数) 推出,这样的话,用 f[i] 代表数i的最少完全平方数,它是由 f[i - (符合(i - 完全平方数 >= 0)的这个完全平方数)] 推出来的。
我们不妨先把所有n上限以内的所有完全平方数打表,这样在写DP的循环时就比较直观,不容易搞错了。

3.代码

class Solution {
    
    
public:
    int numSquares(int n) {
    
    
        
        int s[10010],cnt=0;
        memset(s,0,sizeof(s));
        for(int i=1;i<=100;i++){
    
    //找出所有10000以内的完全平方数
            s[cnt++]=i*i;
        }


        int f[10010];
        memset(f,0,sizeof(f));
        f[0]=0;
        for(int i=1;i<=n;i++){
    
    
            f[i]=1e9;//因为要求最小值,所以我们先把f[i]开到很大很大,方便使用min
            for(int j=0;j<cnt&&i-s[j]>=0;j++){
    
    
                int mid=f[i-s[j]];
                f[i]=min(f[i],mid+1);
            }
        }

        return f[n];

    }
};

猜你喜欢

转载自blog.csdn.net/qq_43579980/article/details/117804133
今日推荐