列表

详情


NC173. 填充数组

描述

牛妹给了牛牛一个长度为 的下标从开始的正整型数组 ,粗心的牛牛不小心把其中的一些数字删除了。

假如被删除了,则。对于所有被删除的数字,牛牛必须选择一个正整数填充上。现在牛牛想知道有多少种填充方案使得:

函数传入一个下标从开始的数组 和一个正整数 ,请返回合法的填充方案数对 取模的值,保证不存在方案数为0的数据。

示例1

输入:

[0,4,5],6

输出:

4

说明:

所有的合法填充方案是:[1,4,5],[2,4,5],[3,4,5],[4,4,5],共4种。

示例2

输入:

[1,0,0],3

输出:

6

说明:

所有的合法填充方案是:[1,1,1],[1,1,2],[1,2,2],[1,2,3],[1,3,3],[1,1,3]共6种

示例3

输入:

[0,0,0,0,0,67,0,0],100

输出:

746845806

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 428KB, 提交时间: 2021-11-24

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int FillArray(vector<int>& a, int k) {
        int size=a.size();
        int64_t total=1;
        int idx=0;
        while(idx<size) {
            while(idx<size && a[idx]!=0) {
                ++idx;
            }
            if(idx==size) break;
            
            int start=idx;
            int sval=1;
            if(idx>0) sval=a[idx-1];
            
            while(idx<size && a[idx]==0) {
                ++idx;
            }
            
            int end=idx;
            int eval=k;
            if(idx<size) {
                eval=a[idx];
            }

            total*=calu(eval-sval+1, end-start);
            total%=mod;
        }
        
        return total;
    }
    
private:
    static const int mod=1000000007;
    
    int calu(int nums, int len) {
        vector<int> total(len+1, 1);
        for(int i=2;i<=nums;++i) {
            total[1]=i;
            for(int j=2;j<=len;++j) {
                total[j]+=total[j-1];
                total[j]%=mod;
            }
        }
        
        return total[len];
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 420KB, 提交时间: 2022-01-23

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int FillArray(vector<int>& a, int k) 
    {
        long sum = 1;
        int preIdx = 0;
        int curIdx = 0;
        
        for(curIdx = 0, preIdx = 0; curIdx<a.size(); ++curIdx)
        {
            if(a[curIdx] == 0)
                continue;
            else
            {
                if(curIdx - preIdx > 0)
                {
                    
                    int preVal = preIdx==0 ? a[curIdx] : a[curIdx] - a[preIdx - 1] + 1;
                    sum *= calc(curIdx - preIdx, preVal);
                    sum %= 1000000007;
                    preIdx = curIdx;
                }
                
                ++preIdx;
            }
        }
        
        if(curIdx - preIdx > 0)
        {
            sum *= calc(curIdx - preIdx, k - a[preIdx-1] +1);
            sum %= 1000000007;
        }
        return sum;
        //return calc(5,4);
    }
    
    
    int calc(int size, int range)
    {
        if(range == 1) return 1;
        if(size == 1) return range;
        
        vector<int> sumVal(range+1, 1);

        int sum = range;
       
        
        for(int i=2; i<=size+1; ++i)
        {
            for(int j =2; j<=range; ++j)
            {
                sumVal[j] += sumVal[j-1];
                sumVal[j] %= 1000000007;
            }
        }
        return sumVal[range];
    }
};

class Solution1 {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int FillArray(vector<int>& a, int k) 
    {
        long sum = 1;
        int preIdx = 0;
        int curIdx = 0;
        
        for(curIdx = 0, preIdx = 0; curIdx<a.size(); ++curIdx)
        {
            if(a[curIdx] == 0)
                continue;
            else
            {
                if(curIdx - preIdx > 0)
                {
                    
                    int preVal = preIdx==0 ? a[curIdx] : a[curIdx] - a[preIdx - 1] + 1;
                    sum *= calc(curIdx - preIdx, preVal);
                    sum %= 1000000007;
                    preIdx = curIdx;
                }
                
                ++preIdx;
            }
        }
        
        if(curIdx - preIdx > 0)
        {
            sum *= calc(curIdx - preIdx, k - a[preIdx-1] +1);
            sum %= 1000000007;
        }
        
        return sum;
    }
    
    //have something wrong: 22/25通过
    int calc(int size, int range)
    {
        if(range == 1) return 1;
        if(size == 1) return range;
        
        vector<int> subtract(range, 1);

        int sum = range;
        int curVal = 0;
        int nexVal = 0;
        
        for(int i=2; i<=size; ++i)
        {
            int levelSum = 0;
            curVal = sum % 1000000007;
            for(int j =1; j<=range-1; ++j)
            {
                if(levelSum < 0)
                {
                    int a = 1;
                    int b =2;
                    b += a;
                }
                
                levelSum +=curVal;
                levelSum %= 1000000007;
                nexVal = curVal % 1000000007 - subtract[j]% 1000000007;
                subtract[j] = curVal % 1000000007;
                curVal = nexVal % 1000000007;
            }
            
            levelSum += curVal;
            levelSum %= 1000000007;
            sum = levelSum;
        }
        return sum;
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 432KB, 提交时间: 2021-12-23

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector 
     * @param k int整型 
     * @return int整型
     */
    
    static const int mod = 1000000007;
    
    int calu(int nums,int len)
    {
        vector<int> total(len+1,1);
        for (int i = 2;i<=nums;i++)
        {
            total[1] = i;
            for (int j = 2;j <=len;j++)
            {
                total[j] += total[j-1];
                total[j] %= mod;
            }
        }
        return total[len];
    }
    
    int FillArray(vector<int>& a, int k) {
        int size=a.size();
        int64_t total=1;
        int idx=0;
        while(idx<size) {
            while(idx<size && a[idx]!=0) {
                ++idx;
            }
            if(idx==size) break;
             
            int start=idx;
            int sval=1;
            if(idx>0) sval=a[idx-1];
             
            while(idx<size && a[idx]==0) {
                ++idx;
            }
             
            int end=idx;
            int eval=k;
            if(idx<size) {
                eval=a[idx];
            }
 
            total*=calu(eval-sval+1, end-start);
            total%=mod;
        }
         
        return total;
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 436KB, 提交时间: 2021-12-09

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param a int整型vector
     * @param k int整型
     * @return int整型
     */
    typedef long long ll;
    const ll mod = 1e9 + 7;
    ll fpow(ll a, ll b) {
        ll res = 1;
        while (b) {
            if (b & 1) res = res * a % mod;
            a = a * a % mod;
            b >>= 1;
        }
        return res;
    }

    int FillArray(vector<int> &a, int k) {
        // write code here
        int len = a.size() + k + 1;
        vector<int> c(len, 1), inv(len, 1);
        ll sum = 1;
        int minn = 1;
        for (int i = 1; i < len; ++i) c[i] = 1ll * c[i - 1] * i % mod;
        inv[len - 1] = fpow(c[len - 1], mod - 2);
        for (int i = len - 2;i > 0;--i) inv[i] = inv[i + 1] * (i + 1ll) % mod;
        for (int i = 0; i < a.size(); ++i) {
            if (a[i]) {
                minn = a[i];
            } else {
                int cnt = 0;
                while (!a[i] && i < a.size()) {
                    cnt++;
                    i++;
                }
                if (i == a.size()) a.emplace_back(k);
                int n = (a[i] ? a[i] : k) - minn + 1, m = cnt;
                sum *= 1ll * c[n + cnt - 1] * inv[cnt] % mod * inv[n - 1] % mod;
                sum %= mod;
                minn = a[i];
            }
        }
        return sum;
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 452KB, 提交时间: 2022-07-05

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector 
     * @param k int整型 
     * @return int整型
     */

    int FillArray(vector<int>& a, int k) {
        // write code here
        vector<long long>res;
        long long ans=1,mod=1000000007;
        a.insert(a.begin(),1);
        a.push_back(k);
        long len=a.size(),l=0,r=0;
        for(long i=0;i<len;i++)
        {
            if(a[i]==0)
            {
                 l=i-1;
                while(a[i]==0)
                    i++;
                 r=i;
                vector<long long>dp(a[r]-a[l]+1,1);
                for(long j=r-l-1;j>0;j--)
                {
                    for(long long t=a[r]-a[l]-1;t>=0;t--)
                    {
                        dp[t]=(dp[t]+dp[t+1])%mod;
                    }
                }
                res.push_back(dp[0]%mod);
            }
        }
        for(long i=0;i<res.size();i++)
            ans=(ans*res[i])%mod;
        return ans;
    }
};

上一题