Leetcode 957. Prison Cells After N Days(N天后的牢房)

 

Leetcode 957. Prison Cells After N Days

难度等级

中等

描述

有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为常数
posted @ 2022-01-11 16:01  Dre_am_tale  阅读(42)  评论(0编辑  收藏  举报