原题链接:6072. 转角路径的乘积中最多能有几个尾随零
参考的周赛大佬代码,我只能说“妙啊,秒啊”要变成妙蛙种子了,大佬们的代码就是写的漂亮简洁,要多看别人的代码学习:
class Solution {
public:
int maxTrailingZeros(vector<vector<int>>& grid) {
int n=grid.size();
int m=grid[0].size();
int res=0;
vector<vector<pair<int,int> > > B(n,vector<pair<int,int> >(m));
vector<vector<pair<int,int> > > L,R,U,D;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
while(grid[i][j]%2==0)
{
B[i][j].first++;
grid[i][j]/=2;
}
while(grid[i][j]%5==0)
{
B[i][j].second++;
grid[i][j]/=5;
}
}
}
L=R=U=D=B;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(i>0)
U[i][j]=make_pair(U[i-1][j].first+U[i][j].first,U[i-1][j].second+U[i][j].second);
if(j>0)
L[i][j]=make_pair(L[i][j-1].first+L[i][j].first,L[i][j-1].second+L[i][j].second);
}
}
for(int i=n-1;i>=0;i--)
{
for(int j=m-1;j>=0;j--)
{
if(i+1<n)
D[i][j]=make_pair(D[i][j].first+D[i+1][j].first,D[i][j].second+D[i+1][j].second);
if(j+1<m)
R[i][j]=make_pair(R[i][j].first+R[i][j+1].first,R[i][j].second+R[i][j+1].second);
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
res=max(res,min(L[i][j].first+U[i][j].first-B[i][j].first,L[i][j].second+U[i][j].second-B[i][j].second));
res=max(res,min(L[i][j].first+D[i][j].first-B[i][j].first,L[i][j].second+D[i][j].second-B[i][j].second));
res=max(res,min(R[i][j].first+U[i][j].first-B[i][j].first,R[i][j].second+U[i][j].second-B[i][j].second));
res=max(res,min(R[i][j].first+D[i][j].first-B[i][j].first,R[i][j].second+D[i][j].second-B[i][j].second));
}
}
return res;
}
};