Leetcode 957. Prison Cells After N Days(N天后的牢房)
难度等级
中等
描述
有8个牢房,每间牢房有两个状态0和1。
如果一间牢房的两个相邻的房间都被占用或者都是空的,也就是说相邻的房间状态相同。那个这一间牢房会被占用,否则会被空置。
由于头尾牢房没有相邻房间,那么如果day >=1,头尾牢房一定被空置。
示例
输入:cells = [0,1,0,1,1,0,0,1], N = 7
输出:[0,0,1,1,0,0,0,0]
解释:
下表概述了监狱每天的状况:
Day 0: [0, 1, 0, 1, 1, 0, 0, 1]
Day 1: [0, 1, 1, 0, 0, 0, 0, 0]
Day 2: [0, 0, 0, 0, 1, 1, 1, 0]
Day 3: [0, 1, 1, 0, 0, 1, 0, 0]
Day 4: [0, 0, 0, 0, 0, 1, 0, 0]
Day 5: [0, 1, 1, 1, 0, 1, 0, 0]
Day 6: [0, 0, 1, 0, 1, 1, 0, 0]
Day 7: [0, 0, 1, 1, 0, 0, 0, 0]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/prison-cells-after-n-days
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
solution
由于只有2^8 = 256种状态,随着day增加,一定会有重复。
如果有重复,则后面不需要再继续计算。
所以我们需要记录之前产生的序列。
class Solution { public int[] prisonAfterNDays(int[] prison, int N) { if (N == 0) return prison; int temp[] = (int[]) prison.clone(); int days = 0; List<String> list = new ArrayList<>(); StringBuilder str = new StringBuilder(); while (++days <= N) { if (days == 1) { prison[0] = 0; prison[prison.length - 1] = 0; } for (int i = 1; i < prison.length - 1; i++) { if (temp[i - 1] == temp[i + 1]) prison[i] = 1; else prison[i] = 0; } temp = (int[]) prison.clone(); for (int i = 0; i < temp.length; i++) str.append(temp[i]); if (list.contains(str.toString())) { break; } list.add(str.toString()); str = new StringBuilder(); } int index = (N - 1) % list.size(); String resString = list.get(index); for (int i = 0; i < temp.length; i++) temp[i] = resString.charAt(i) - '0'; return temp; } }
// 算法复杂度O(k *n),k为常数