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

京公网安备 11010502036488号