LeetCode 279. 完全平方数(DP、记忆化搜索、宽度优先搜索、数学)

完全平方数
DP其实是最好想的,宽搜其次。
时间复杂度: O ( n 3 / 2 ) O(n^{3/2})

class Solution {
public:
    // 记忆化搜索
    int vis[1000000] = {0};
    int numSquares0(int n) {
        if(vis[n]){
            return vis[n];
        }
        if(n==0) return 0;
        int res = 1e9;
        for(int j=1;j*j<=n;j++){
            res = min(res,1+numSquares(n-j*j));
        }
        return vis[n] = res;
    }

    //DP
    int numSquares1(int n){
        vector<int> dp(n+1,1e9);
        dp[0] = 0;
        for(int i=1;i<=n;i++){
            for(int j=1;j*j<=i;j++){
                dp[i] = min(dp[i],dp[i-j*j]+1);
            }
        }
        return dp[n];
    }

    //BFS
    int numSquares(int n){
        vector<bool> vis(n,false);
        queue<int> q;
        int dpt = 0;
        q.push(0);
        while(q.size()){
            int size = q.size();
            while(size--){
                int x = q.front();
                q.pop();
                for(int j=1;j*j+x<=n;j++){
                    if(j*j+x == n){
                        return dpt+1;
                    }
                    if(!vis[j*j+x]){
                        q.push(j*j+x);
                        vis[j*j+x] = 1;
                    }
                }
            }
            dpt++;
        }
        return -1;
    }
};

降维打击的数学方法就不说了,蒙~~

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/107641798