这道是该场里边的第一道(菜,没做出来),当然确实比较难。从easy难度的角度出发我们一般都是想到用O(N²)的复杂度写一个更新函数,然后遍历到该天后返回,但提交后发现超时,且只有一个例子通过,到这时我们应该转换思路。
题目告诉我们相当于共8个信号,因此有2的8次方共256种状态,所以当N足够大时,必然形成环(当然一般是局部的)。所以我们应该求出来该环,即一个二维数组,之后再通过数学计算将N缩小为n后返回,代码如下:
class Solution {
public:
vector<int> prisonAfterNDays(vector<int>& cells, int N) {
if (N == 0) {
return cells;
}
int beg;
int count;
vector<vector<int>>status, repeated;
for (count = 0;count < N;count++) {
cells = update(cells);
if (isrepeated(status, cells) >= 0) {
beg = isrepeated(status, cells);
break;
}
status.push_back(cells);
}
if (count == N) {
return status.back();
}
for (int i = beg;i < status.size();i++) {
repeated.push_back(status[i]);
}
int idx = (N - beg) % repeated.size();
if (idx == 0) {
return repeated.back();
}
return repeated[idx - 1];
}
vector<int> update(vector<int>pre) {
vector<int>cur = pre;
cur.front() = cur.back() = 0;
for (int i = 1;i < pre.size() - 1;i++) {
if (pre[i - 1] == pre[i + 1]) {
cur[i] = 1;
}
else
{
cur[i] = 0;
}
}
return cur;
}
int isrepeated(vector<vector<int>>&status, vector<int>flag) {
for (int i = 0;i < status.size();i++) {
if (flag == status[i]) {
return i;
}
}
return -1;
}
};
另外注意一下由于初始状态中第一个牢房的值可以不为0,所以我们不能将其添加到二维数组中。
参考:https://blog.csdn.net/u013383813/article/details/85040454