假设n=max-min表示可填数字个数,zero表示连续0的个数,
A[i][j]为出现或多次出现0时可填总数,,i为max-min-1,j为zero-1则:A[I][j]=A[i-1][j]+A[i][j-1];
测试了下A[15][15]就已经超过1000000007了。
进一步推理可以发现A[I][j]=A[j][i].
这应该是解题关键。
代码1:可以解决连续几十个几百个0的问题,用空间换时间。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int FillArray(vector<int>& a, int k) {
        // write code here
        if(a.size()==0) return 0;
        if(a.size()==1) return (a[0]==0)?k:0;
        vector<int>::iterator it=find(a.begin(),a.end(),0);
        if(it==a.end()) return 0;
        int A[1000][10000]={0};
        int N=(a.size()>k)?a.size():k;
        //对数组赋值,只赋值右上三角,因为A[i][j]=A[j][i]
        A[0][0]=2;//n=1,zero=1;
        for( int j=1;j<N;++j) A[0][j]=j+2;
        for(int i=1;i<N;++i) {
            A[i][i]=(2*A[i-1][i])%1000000007;
            for(int j=i+1;j<N;++j) {
                A[i][j]=(A[i-1][j]+A[i][j-1])%1000000007;
            }
        }
        int min=1,max=k;
        unsigned long long  num=1;
        int zero=0;//列
        int n;//n=max-min,行
        for(vector<int>::size_type i=0;i<a.size()&&min<k;++i) {
            if(a[i]==0) {
                zero=0;
                while(i<a.size()&&a[i]==0) {
                    ++i;
                    ++zero;
                }
                max=(i>=a.size())?k:a[i];
                if(max==min) num*=1;
                else {
                    n=max-min;
                    if(n>zero) {
                        num=(num*A[zero-1][n-1])%1000000007;
                    }
                    else {
                        num=(num*A[n-1][zero-1])%1000000007;
                    }
                }
                if(i<a.size()) min=a[i];
            }
            else if(i<a.size()){
                min=a[i];
            }
        }
        return int(num);
    }
};
以下代码是常规思路写的,碰到连续几十几百个0就会出现运行超时。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int FillArray(vector<int>& a, int k) {
        // write code here
        if(a.size()==0) return 0;
        if(a.size()==1) return (a[0]==0)?k:0;
        vector<int>::iterator it=find(a.begin(),a.end(),0);
        if(it==a.end()) return 0;
        int min=1,max=k;
        long long num=1;
        long long sum=0;
        int zero=0;
        for(vector<int>::size_type i=0;i<a.size();++i) {
            if(a[i]==0) {
                zero=0;
                while(i<a.size()&&a[i]==0) {
                    ++i;
                    ++zero;
                }
                max=(i>=a.size()-1)?k:a[i];
                sum=TF(max,min,zero);
                num=(num*sum)%1000000007;
                min=a[i];
            }
            else min=a[i];
        }
        return num;
    }
public:
    int TF(int max,int min,int zero) {
        if(1==zero) return max-min+1;
        if(2==zero) return (max-min+1)*(max-min+2)/2;
        if(max==min) return 1;
        long long sum=0;
        for(int i=0;i<max-min+1;++i) {
           // if(sum>=1000000007) sum%=1000000007;
            sum+=TF(max-i,min,zero-1);
        }
        return sum%1000000007;
    }
};