假设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; } };