LeetCode 279 完全平方數

找完全平方數加和,哇赤裸裸的dp啊。

第一遍超時了 = =這種狀態遷移方程複雜度較高

第二遍膜了一遍題解區的大佬們代碼,漲知識遼,(vector原來可以這麼用)。
新的狀態遷移方程dp[i+jj]=min(dp[i+jj],dp[i]+1),每次一個普通數加上一個完全平方數的話就可以降低複雜度。

// 超時代碼 = =
class Solution {
    
public:
    int numSquares(int n) {
        int dp[n+1] = {INT_MAX};
        dp[1] = 1;
        for(int i = 1 ; i*i <= n ; i++){
            dp[i*i] = 1; //自身就是完全平方數
        }
        for(int i = 1; i <= n ; i++ ){
            if(dp[i] == 1) {
                //cout<<i<<" "<<dp[i]<<endl;
                continue;
            }
            else{
                dp[i] = INT_MAX;
                //cout<<"before"<<i<<" "<<dp[i]<<endl;
                for(int j = 1; j <= (i/2); j++){
                    dp[i] = min(dp[j]+dp[i-j], dp[i]);
                }
            }
            //cout<<i<<" "<<dp[i]<<endl;

        }
        return dp[n];
    }
};
// new code
class Solution {
public:
    int numSquares(int n) {
        vector<int> dp(n+1,INT_MAX);
        dp[0]=0;
        for(int i=0;i<=n;i++){
            for(int j=1;i+j*j<=n;j++){
                dp[i+j*j]=min(dp[i+j*j],dp[i]+1);
            }
        }
        return dp.back();
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章