本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、题目描述:
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
二、思路分析:
- 通过观察前21天的牢房变化情况可知该变化的周期为14,比如:第15,29天的情况和第1天一样,但需要注意的是,哪怕该变得次数为0,则第1个和最后一个的状态为0,所以应首先将第一个和最后一个的状态置为0。
- 首先计算出前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;
}
}
四、总结:
刷题就刷题,这题目咋越来越诡异了呢。