【刷题打卡】957. N 天后的牢房

185 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、题目描述:

957. N 天后的牢房 - 力扣(LeetCode) (leetcode-cn.com)

8 间牢房排成一排,每间牢房不是有人住就是空着。

每天,无论牢房是被占用或空置,都会根据以下规则进行更改:

  • 如果一间牢房的两个相邻的房间都被占用或都是空的,那么该牢房就会被占用。
  • 否则,它就会被空置。

(请注意,由于监狱中的牢房排成一行,所以行中的第一个和最后一个房间无法有两个相邻的房间。)

我们用以下方式描述监狱的当前状态:如果第 i 间牢房被占用,则 cell[i]==1,否则 cell[i]==0

根据监狱的初始状态,在 N 天后返回监狱的状况(和上述 N 种变化)。

 

示例 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]

示例 2:

输入:cells = [1,0,0,1,0,0,1,0], N = 1000000000
输出:[0,0,1,1,1,1,1,0]

提示:

  • cells.length == 8
  • cells[i] 的值为 0 或 1 
  • 1 <= N <= 10^9

二、思路分析:

  1. 通过观察前21天的牢房变化情况可知该变化的周期为14,比如:第15,29天的情况和第1天一样,但需要注意的是,哪怕该变得次数为0,则第1个和最后一个的状态为0,所以应首先将第一个和最后一个的状态置为0。
  2. 首先计算出前14天的状态并将其放入一个list,然后对计算的天数取余,如天数为15,则余数为1,此时只需要list.get(0)即可,

如天数为7,则余数为7,此时只需要list.get(6)即可。

三、AC 代码:

public class PrisonAfterNDays {

    public int[] prisonAfterNDays(int[] cells, int N) {
        if (N == 0) {
            cells[0] = 0;
            cells[cells.length - 1] = 0;
            return cells;
        }
        final List<int[]> res = new ArrayList<>(14);
        int[] tmp = new int[cells.length];
        for (int index = 0; index < 14; ++index) {
            tmp = getRes(cells);
            cells = tmp;
            res.add(cells);
        }
        final int index = N % 14;
        if (index == 0) {
            return res.get(13);
        }
        return res.get(index - 1);
    }
    private int[] getRes(int[] cells) {
        final int[] ret = new int[cells.length];
        ret[0] = 0;
        ret[cells.length - 1] = 0;
        for (int index = 1; index < cells.length - 1; ++index) {
            if (cells[index - 1] == cells[index + 1]) {
                ret[index] = 1;
            }
        }

        return ret;
    }
}

四、总结:

刷题就刷题,这题目咋越来越诡异了呢。