用队列来存取每个0的下标,按顺序遍历每个点
如果当前点到队头的距离 大于 当前点到队头下一个元素的距离,
则说明当前点和当前点以后的点到队头的距离都会 大于 当前点和当前点以后的点到队头下一个元素的点,所以将队头出队
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 200010;
int a[N];
int n;
int main()
{
cin >> n;
int cnt = 0;
int q[N],hh = 0,tt = -1;
for(int i = 0; i < n; i ++)
{
cin >> a[i];
if(!a[i]) q[++tt] = i;
}
for(int i = 0; i < n; i ++)
{
while(abs(i-q[hh]) > abs(i-q[hh+1]) && tt) hh++; //判断当前点到队头的距离 是否大于 当前点到队头下一个元素的距离
cout << abs(i-q[hh])<< " ";
}
}
太牛了吧
嘻嘻😋