zoukankan      html  css  js  c++  java
  • 队列&栈//完全平方数

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

    示例 1:

    输入: n = 12
    输出: 3 
    解释: 12 = 4 + 4 + 4.

    示例 2:

    输入: n = 13
    输出: 2
    解释: 13 = 4 + 9.
    class Solution {
    public:
        int numSquares(int n) {
            while(n%4==0) n/=4;
            if(n%8==7) return 4;
            for(int i=0;i*i<=n;i++){
                int j=sqrt(n-i*i);
                if(i*i+j*j==n)
                    {
                        return !!i+!!j;
                    }
            }
            return 3;
        }
    };
    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; j*j+i <= n; j++){
                    dp[i+j*j] = min(dp[i+j*j],dp[i]+1);
                }
            }
            return dp[n];//return dp.back()也可以
        }
    };
    class Solution {
    public:
        int numSquares(int n) {
            vector<int> dp(1,0);
            while(dp.size() <= n){
                int m = dp.size(), val = INT_MAX;
                for(int i = 1; i * i <= m; i++){
                    val = min(val, dp[m-i*i]+1);
                }
                dp.push_back(val);
            }
            return dp.back();
        }
    };
    class Solution {
    public:
        int numSquares(int n) {
            int dp[n];
            memset(dp,0,n*sizeof(n));
            int res=dfs(n,0,dp);
            return res;
        }
    private:
        int dfs(int n,int count,int *dp){
            if(n==0) return count;
            int c=0;
            if((c=dp[n-1])!=0)
                return count+c;
            int res=INT_MAX;
            int j=(int)sqrt(n);
            for(int i=j;i>=(j/2+1);i--){
                int num=n-pow(i,2);
                int c=dfs(num,count+1,dp);
                res=min(res,c);
            }
            dp[n-1]=res-count;
            return res;
        }
    };
  • 相关阅读:
    更好一点的:Vue 利用指令实现禁止反复发送请求
    实现一个深度比较
    Zrender:实现波浪纹效果
    Echarts:实现拖拽效果
    找到树中指定id的所有父节点
    Vue 利用指令实现禁止反复发送请求
    我对组件化的一点细琐的想法
    转盘式旋转抽奖
    信息系统与信息化
    跳出牢笼,逃出生天
  • 原文地址:https://www.cnblogs.com/strawqqhat/p/10602366.html
Copyright © 2011-2022 走看看