leetcode957. N 天后的牢房(java-14天周期优化)

news/2024/11/19 17:49:46/

N 天后的牢房

  • leetcode957. N 天后的牢房
  • 题目描述
    • 解题思路
    • Java 代码演示
  • 算法专题

leetcode957. N 天后的牢房

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/prison-cells-after-n-days

题目描述

监狱中 8 间牢房排成一排,每间牢房可能被占用或空置。
每天,无论牢房是被占用或空置,都会根据以下规则进行变更:
如果一间牢房的两个相邻的房间都被占用或都是空的,那么该牢房就会被占用。
否则,它就会被空置。
注意:由于监狱中的牢房排成一行,所以行中的第一个和最后一个牢房不存在两个相邻的房间。
给你一个整数数组 cells ,用于表示牢房的初始状态:如果第 i 间牢房被占用,则 cell[i]==1,否则 cell[i]==0 。另给你一个整数 n 。
请你返回 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 <= 109

解题思路

讲解这个题之前先复习下二进制算法的异或算法:
1 ^ 0 = 1
0 ^ 1 = 1
1 ^ 1 = 0
0 ^ 0 = 0
推论: 0 ^ N = N ,N ^ N = 0 (N 代表整数)
当我们看到相邻的房间同时为0 或者同时为1 时,第二天是满的,也即是1,有没有想到用异或算法.
同时为0 或者 1 异或后还是0,再和1异或,就是1了,
如果相邻的两个房间是一个空的一个满的,那异或后就是1,再和1异或后,就是0了,
所以推出状态转移公式为:
i 和 j 代表天数和房间
DP[i][j] = DP[i-1][j-1] ^ DP[i-1][j+1] ^ 1(if 0<j<6),
DP[i][j] = 0 (if j0 or j7)

寻找周期
从第一天到第N天,第1个房间和第8个房间永远为闲置状态(状态为0)
设8个房间的第1天的状态为:s1, s2, s3, s4, s5, s6, s7, s8
那么接下来第1~N天,最左边的s1和最后边的s8永远是0
第1天状态为:0, s2, s3, s4, s5, s6, s7, 0
第2天第2个房间的状态为:0s31 = s3^1
第3天第3个房间的状态为:s31s3s51^1 = (s3s3)1s5(1^1) = 01s5^0 = s5^1

在这里插入图片描述
由推导可知,每14天为1个循环周期

Java 代码演示

    /*** N 天后的房间* @param cells* @param n* @return*/public int[] prisonAfterNDays(int[] cells, int n) {//14 天一个周期,求余n = n % 14;//刚好整除时,代表最后一天if (n == 0){n = 14;}//记录下一天的情况,int[] newList = new int[cells.length];for (int day = 0;day < n;day++ ){for (int i = 1; i < cells.length - 1;i++){newList[i] = cells[i - 1] ^ cells[i + 1] ^ 1;}//把下一天的情况拷贝回去,进行下一次的判断cells = deepCopyList(newList);}return newList;}/*** 拷贝数组* @param cells* @return*/private  int[] deepCopyList(int[]cells) {int[] newList = new int[cells.length];for (int i = 0; i < cells.length;i++){newList[i] = cells[i];}return newList;}

算法专题

leetcode464. 我能赢吗

leetcode97. 交错字符串

leetcode474. 一和零

leetcode583. 两个字符串的删除操作

leetcode514. 自由之路

leetcode72. 编辑距离


http://www.ppmy.cn/news/651037.html

相关文章

计算机打开程序乱码,打开软件乱码怎么解决,详解win7电脑打开软件乱码的解决方法...

今天小编给大家详解win7电脑打开软件乱码的解决方法&#xff0c;使用win7系统过程中&#xff0c;有时用户会遇到电脑打不开软件&#xff0c;打开乱码的问题&#xff0c;为此问题困扰的用户&#xff0c;可参照以下的方法进行解决。 最近有位win7系统用户使用电脑的时候&#xff…

解决电脑解压中文乱码问题

打开控制面板 点击图中的 更改日期、时间和数字格式 点击 管理 然后选择 更改系统区域设置 有问题的情况下&#xff0c;Beta版是被勾选的&#xff0c;取消勾选 点击确定&#xff0c;系统会提醒重启&#xff0c;重启之后&#xff0c;解压将不出现乱码

tbslog乱码转换_tbslog乱码转换

tbslog乱码转换 方法不但可解决电脑中英)乱码 而且还解决由简体繁别的引起乱码。 提供以下方法: 方法1.进入YAHOO邮箱并打开邮件后,点击电脑中浏览器IE“查看” “编码”“简体中文(GB2312)”或者“其他”如“繁体” 可以先进入电脑IE这部分查看一下,里面有许多选项。 方法2…

台式计算机有乱码如何解决,电脑出现乱码怎么修复 电脑字体乱码解决方法

我们在使用电脑的时候&#xff0c;如果出现乱码&#xff0c;那么就会给我们造成显示的影响&#xff0c;关于电脑乱码&#xff0c;其实可以分为几大类&#xff0c;比如系统乱码、软件乱码、文件乱码、网页乱码等&#xff0c;电脑出现乱码怎么修复&#xff1f;下面装机之家小编为…

台式计算机标题出现乱码,电脑系统显示乱码的两种解决办法

有网友的电脑出了问题&#xff0c;系统的菜单&#xff0c;标题等处变成了乱码&#xff0c;到百度知道求助&#xff0c;提供了一张如下的乱码图片&#xff0c;希望得到解决。出现乱码的有几种情况&#xff0c;一是系统乱码&#xff0c;主要是桌面&#xff0c;菜单&#xff0c;标…

java 文件上传乱码_java上传txt文件,出现中文乱码

public String uploadBook(MultipartFile file, Book book, HttpServletRequest request) {try{String lineTxt = null; String content=""; List titlelist=new ArrayList(); InputStream inputStream = null;//获得字节流 if(!file.isEmpty()){InputStreamReader i…

文本文档html乱码,文本文档乱码怎么办?电脑文本文档乱码解决方法

有时候我们在网上下载了一些文档,打开之后发现全是乱码,很多用户顿时不知道怎么办,其实文档打开乱码可能是系统没有这个文字也有可能是打开的软件有问题,那么当你有遇到文本文档乱码该怎么办呢?不懂的朋友看看小编整理的解决方法吧! 方法/步骤: 1、下载一篇文档,不管用…

计算机语言变成乱码怎么办,电脑文本文档出现乱码,教你电脑文本文档出现乱码怎么办...

最近有用户发现遇到了文本文档乱码的问题&#xff0c;不知如何解决而困扰&#xff0c;在日常的生活当中时常会碰到各种各样的问题&#xff0c;我们还是要尽力的去想办法解决好问题。为此&#xff0c;下面小编教你电脑文本文档出现乱码怎么办吧。 1、遇到这种情况&#xff0c;最…