這道是該場裏邊的第一道(菜,沒做出來),當然確實比較難。從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