题意
给你一列数字,问每个位置距离最近的0的距离是多少
思路
先找到每一个0的位置,对于在第一个0之前的答案就是第一个0的位置减它的位置,介于第一个0和最后一个0中间的就比较它和前头最近的0和后头最近的0的距离,最后一个0之后的就是它的位置减最后一个0的位置,对于中间那部分我们可以记录当前位置右边最近的是第几个0,这样每一次计算就是O(1)的复杂度,每一次超过的时候对这个值更新
代码
#include <cstdio>
#include <algorithm>
using namespace std;
int num[200001];
int zero[200001];
int main()
{
int n,e,p;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
e=0;
for(int i=0;i<n;i++)
if(num[i]==0)
zero[e++]=i;
for(int i=0;i<=zero[0];i++)
printf("%d ",zero[0]-i);
p=1;
for(int i=zero[0]+1;i<=zero[e-1];i++)
{
if(i<=zero[p])
printf("%d ",min(i-zero[p-1],zero[p]-i));
else
{
p++;
printf("%d ",min(i-zero[p-1],zero[p]-i));
}
}
for(int i=zero[e-1]+1;i<n;i++)
printf("%d ",i-zero[e-1]);
printf("\n");
return 0;
}