【刷题-LeetCode】289. Game of Life
- Game of Life
According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conway in 1970."
Given a board with m by n cells, each cell has an initial state live (1) or dead (0). Each cell interacts with its eight neighbors (horizontal, vertical, diagonal) using the following four rules (taken from the above Wikipedia article):
- Any live cell with fewer than two live neighbors dies, as if caused by under-population.
- Any live cell with two or three live neighbors lives on to the next generation.
- Any live cell with more than three live neighbors dies, as if by over-population..
- Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction.
Write a function to compute the next state (after one update) of the board given its current state. The next state is created by applying the above rules simultaneously to every cell in the current state, where births and deaths occur simultaneously.
Example:
Input:
[
[0,1,0],
[0,0,1],
[1,1,1],
[0,0,0]
]
Output:
[
[0,0,0],
[1,0,1],
[0,1,1],
[0,1,0]
]
Follow up:
- Could you solve it in-place? Remember that the board needs to be updated at the same time: You cannot update some cells first and then use their updated values to update other cells.
- In this question, we represent the board using a 2D array. In principle, the board is infinite, which would cause problems when the active area encroaches the border of the array. How would you address these problems?
解法1 将原矩阵复制下来,按照游戏规则修改原来的矩阵
class Solution {
public:
void gameOfLife(vector<vector<int>>& board) {
vector<vector<int>>tmp_board(board.begin(), board.end());
int m = board.size(), n = board[0].size();
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
int cnt = 0;
for(int k = 0; k < 8; ++k){
int tmp_x = i + dx[k], tmp_y = j + dy[k];
if(valid(tmp_x, tmp_y, m, n) && tmp_board[tmp_x][tmp_y]){
cnt++;
}
}
if(tmp_board[i][j] == 1){
if(cnt < 2 || cnt > 3){
board[i][j] = 0;
}else{
board[i][j] = 1;
}
}else{
if(cnt == 3)board[i][j] = 1;
else board[i][j] = 0;
}
}
}
}
private:
int dx[8] = {-1, 0, -1, -1, 0, 1, 1, 1};
int dy[8] = {0, -1, -1, 1, 1, 0, -1, 1};
bool valid(int x, int y, int m, int n){
if(x < 0 || x >= m || y < 0 || y >= n)return false;
return true;
}
};
解法2 原地修改,\(O(1)\)空间复杂度。使用多个状态:
- 0:原来是0,新的还是0
- 1:原来是1,新的还是1
- 2:原来是0,新的是1
- 3:原来是1,新的是0
按照行顺序更新时,对于每个cell,左、上、左上、右上是被更新了,剩下四个没有更新,按照对应的数值统计出在原始矩阵中的数字,然后更新当前cell,最后遍历一遍,把2和3分别修改成1和0
class Solution {
public:
void gameOfLife(vector<vector<int>>& board) {
int m = board.size(), n = board[0].size();
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
int cnt = 0;
for(int k = 0; k < 4; ++k){
int tmp_x = i + dx[k], tmp_y = j + dy[k];
if(valid(tmp_x, tmp_y, m, n) &&
(board[tmp_x][tmp_y] == 3 || board[tmp_x][tmp_y] == 1)){
cnt++;
}
}
for(int k = 4; k < 8; ++k){
int tmp_x = i + dx[k], tmp_y = j + dy[k];
if(valid(tmp_x, tmp_y, m, n) && board[tmp_x][tmp_y] == 1){
cnt++;
}
}
if(board[i][j] == 1){
if(cnt < 2 || cnt > 3){
board[i][j] = 3;
}else{
board[i][j] = 1;
}
}else{
if(cnt == 3)board[i][j] = 2;
else board[i][j] = 0;
}
}
}
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
if(board[i][j] == 2)board[i][j] = 1;
else if(board[i][j] == 3)board[i][j] = 0;
}
}
}
private:
int dx[8] = {-1, 0, -1, -1, 0, 1, 1, 1};
int dy[8] = {0, -1, -1, 1, 1, 0, -1, 1};
bool valid(int x, int y, int m, int n){
if(x < 0 || x >= m || y < 0 || y >= n)return false;
return true;
}
};
【刷题-LeetCode】289. Game of Life的更多相关文章
- LeetCode刷题------------------------------LeetCode使用介绍
临近毕业了,对技术有种热爱的我也快步入码农行业了,以前虽然在学校的ACM学习过一些算法,什么大数的阶乘,dp,背包等,但是现在早就忘在脑袋后了,哈哈,原谅我是一枚菜鸡,为了锻炼编程能力还是去刷刷Lee ...
- [刷题] Leetcode算法 (2020-2-27)
1.最后一个单词的长度(很简单) 题目: 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度. 如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词. 如果不存在 ...
- bash 刷题leetcode
题目一: 给定一个文本文件 file.txt,请只打印这个文件中的第十行. 示例: 假设 file.txt 有如下内容: Line 1 Line 2 Line 3 Line 4 Line 5 Line ...
- 【刷题-LeetCode】307. Range Sum Query - Mutable
Range Sum Query - Mutable Given an integer array nums, find the sum of the elements between indices ...
- 【刷题-LeetCode】306. Additive Number
Additive Number Additive number is a string whose digits can form additive sequence. A valid additiv ...
- 【刷题-LeetCode】304. Range Sum Query 2D - Immutable
Range Sum Query 2D - Immutable Given a 2D matrix matrix, find the sum of the elements inside the rec ...
- 【刷题-LeetCode】300. Longest Increasing Subsequence
Longest Increasing Subsequence Given an unsorted array of integers, find the length of longest incre ...
- 【刷题-LeetCode】264. Ugly Number II
Ugly Number II Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose ...
- 【刷题-LeetCode】275. H-Index II
H-Index II Given an array of citations sorted in ascending order (each citation is a non-negative in ...
随机推荐
- Base64编码原来是这么回事儿
鸣谢CSDN文章:https://blog.csdn.net/believesoul/article/details/84100616 一.言简意赅理解Base64编码 就是将以"字节&qu ...
- Django 中间件理解
中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 应用场景,对所有 ...
- Tornado WEB服务器框架 Epoll-- 【Mysql数据库】
5.1 数据库 与Django框架相比,Tornado没有自带ORM,对于数据库需要自己去适配.我们使用MySQL数据库. 在Tornado3.0版本以前提供tornado.database模块用来操 ...
- 【JAVA今法修真】 第六章 天道无情,锁定乾坤
您好,我是南橘,万法仙门的掌门,刚刚从九州世界穿越到地球,因为时空乱流的影响导致我的法力全失,现在不得不通过这个平台向广大修真天才们借去力量.你们的每一个点赞,每一个关注都是让我回到九州世界的助力,兄 ...
- SpringBoot整合zimg图片服务器
依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</arti ...
- 【LeetCode】217. Contains Duplicate 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计词频 使用set 排序 日期 [LeetCo ...
- 【LeetCode】172. Factorial Trailing Zeroes 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 递归 循环 日期 题目描述 Given an integer ...
- 【LeetCode】561. Array Partition I 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序 日期 题目地址:https://leetcod ...
- 【LeetCode】108. Convert Sorted Array to Binary Search Tree 解题报告 (Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...
- HMS Core电商与游戏行业解决方案,全流程赋能开发者创新
2021年12月29日,"华为云&华为终端云服务创新峰会2022"在北京柏悦酒店成功举办.华为HMS Core电商与游戏行业解决方案亮相本次峰会的线下展区,为行业开发者们解 ...