leetcode957(contest 113)--N 天后的牢房

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章