[Leedcode][JAVA][第289题][生命游戏]

【问题描述】

根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。示例:输入: 
[[0,1,0],[0,0,1],[1,1,1],[0,0,0]
]
输出:
[[0,0,0],[1,0,1],[0,1,1],[0,1,0]
]

【解答思路】

1. 时间复杂度:O(N) 空间复杂度:O(N)

@leedcodeJerry

image.png

class Solution {int[] dx = {-1, 1, 0, 0, -1, -1, 1, 1};int[] dy = {0, 0, -1, 1, -1, 1, -1, 1};int[][] board;int m, n;public void gameOfLife(int[][] board) {if (board == null || board.length == 0 || board[0] == null || board[0].length == 0) return;this.m = board.length;this.n = board[0].length;// 遍历for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 拿到当前位置周围活细胞数量int cnt = countAlive(i, j);// 1. 活细胞周围八个位置有两个或三个活细胞,下一轮继续活if (board[i][j] == 1 && (cnt == 2 || cnt == 3)) board[i][j] = 3;// 2. 细胞本来死的,周围有三个活着的,下一轮复活了if (board[i][j] == 0 && cnt == 3) board[i][j] = 2;}}// 更新结果for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 右移 1 就是除以 2board[i][j] >>= 1;}}}private int countAlive(int x, int y) {int cnt = 0;for (int k = 0; k < 8; k++) {int nx = x + dx[k];int ny = y + dy[k];if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue;// 如果这个位置为 0,代表是死的,之前死或者之后死都不会算进去// 如果这个位置为 1,代表是是活得,并且是还没遍历到,需要算进去// 如果这个位置为 2,代表是是活得,修改过了,并且之前是死的,不需要算进去// 如果这个位置为 3,代表是是活得,修改过了,并且之前是活的,需要算进去cnt += (board[nx][ny] & 1);}return cnt;}
}

#### 【总结】
**1.方向技巧**

int[] dx = {-1, 1, 0, 0, -1, -1, 1, 1};
int[] dy = {0, 0, -1, 1, -1, 1, -1, 1};

**2.this 关键字用法**
[[Java]中[this][super]用法总结](https://blog.csdn.net/dadongwudi/article/details/105264127)this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
2.1 普通的直接引用
2.2 形参与成员名字重名,用 this 来区分

class Person {
private int age = 10;
public Person(){
System.out.println(“初始化年龄:”+age);
}
public int GetAge(int age){
this.age = age;
return this.age;
}
}

public class test1 {
public static void main(String[] args) {
Person Harry = new Person();
System.out.println("Harry’s age is "+Harry.GetAge(12));
}
}

运行结果:

初始化年龄:10
Harry’s age is 12

可以看到,这里age是GetAge成员方法的形参,this.age是Person类的成员变量。

2.3 引用构造函数
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。**3.手撕代码 例子模拟一遍对于题目的理解很重要**

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习(140):1.7后新特性

import java.sql.Connection;import java.io.IOException; import java.sql.SQLException;//java异常处理 //异常 public class test82 {//定义方法声明定义异常&#xff0c;在满足条件时抛出异常对象&#xff0c;程序转向异常处理public double count(double n, double m, Con…

[剑指offer]面试题第[67]题[Leetcode][JAVA][第8题] 字符串转换整数 (atoi)[字符串]

【问题描述】 请你来实现一个 atoi 函数&#xff0c;使其能将字符串转换成整数。首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为止。接下来的转化规则如下&#xff1a;如果第一个非空字符为正或者负号时&#xff0c;则将…

java学习(141):自定义捕捉异常

//自定义异常类 public class ArrayElement extends Exception{public static final int MAX_NUM1000;private static final String MESSAGE"集合存储元素过多";public ArrayElement(){}public String getMessage(){return MESSAGE"最大元素限制为"MAX_NU…

[Leedcode][JAVA][第42题][动态规划][双指针][栈]

【问题描述】 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。![image.png](https://upload-images.jianshu.io/upload_images/17025746-87f6db1a993ce416.png?imageMogr2/auto-orient/strip%7CimageVie…

java学习(142):file类的基本创建

//file类的基本创建 import java.io.File;public class test85 {public static void main(String[] args){//创建文件对象String filePath"e:\\1.txt";File filenew File( filePath );System.out.println( filenull );//无论给定的文件虚拟路径是否存在//创建file在j…

[Leedcode][JAVA][第460题][LFU]

【问题描述】 设计并实现最不经常使用&#xff08;LFU&#xff09;缓存的数据结构。它应该支持以下操作&#xff1a;get 和 put。get(key) - 如果键存在于缓存中&#xff0c;则获取键的值&#xff08;总是正数&#xff09;&#xff0c;否则返回 -1。 put(key, value) - 如果键…

性能测试十九:jmeter参数优化+排错

一&#xff1a;参数优化 1&#xff0c;控制台取样间隔的设置&#xff0c;在jmeter/bin/jmeter.properties文件中修改 summariser.interval10&#xff0c;默认为30s&#xff0c;最低可修改为6s 2&#xff0c;Jvm参数优化 bin目录下&#xff0c;vi jmeter&#xff0c;修改HEAP的…

java学习(144):file常用方法1

import java.io.File; import java.io.IOException; import java.net.URI; import java.util.List;//文件管理类 public class FileManager {public static File createFileAction(URI uri){//使用URI做出参数创建对象if(uri!null)return new File( uri );return null;}//dir文…

[Leedcode][JAVA][第72题][动态规划]

【问题描述】 [72. 编辑距离] 给你两个单词 word1 和 word2&#xff0c;请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作&#xff1a;插入一个字符 删除一个字符 替换一个字符示例 1&#xff1a;输入&#xff1a;word1 "horse&…

java学习(145):file常用方法2

import java.io.File; import java.io.IOException; import java.net.URI; import java.util.List;//文件管理类 public class FileManager {public static File createFileAction(URI uri){//使用URI做出参数创建对象if(uri!null)return new File( uri );return null;}//dir文…

java uipath_10.3 UiPath如何调用Java

调用Java方法(Invoke Java Method)的介绍从Java Scope中的.jar加载的方法中调用指定的Java方法。并结果存储在变量中二、Invoke Java Method 在UiPath中的使用打开设计器, 在设计库中新建一个Sequence&#xff0c;为序列命名及设置Sequence存放的路径, 在Activities中搜索Java …

java学习(146):file常用方法3

import java.io.File; import java.io.IOException; import java.net.URI; import java.util.List;//文件管理类 public class FileManager {public static File createFileAction(URI uri){//使用URI做出参数创建对象if(uri!null)return new File( uri );return null;}//dir文…

[算法][二分查找][排除法]

最基本的二分查找算法 「搜索区间」是 [left, right] nums[mid] target 时可以立即返回 int binary_search(int[] nums, int target) {int left 0, right nums.length - 1; while(left < right) {int mid left (right - left) / 2;//防止大数溢出if (nums[mid] < t…

java学习(147):字节输入流

//读取二进制文件&#xff0c;字节输入流 import java.io.*;public class FileMana {public static void readBitFile(String filename){//1建立目标要读取的文件对象File filenew File( filename );//2基于目标对象建立输入流InputStream innull;if(file.exists()){//如果文件…

[Leedcode][JAVA][面试题 01.07][找规律][旋转数组]

【问题描述】 [面试题 01.07. 旋转矩阵] 示例 1:给定 matrix [[1,2,3],[4,5,6],[7,8,9] ],原地旋转输入矩阵&#xff0c;使其变为: [[7,4,1],[8,5,2],[9,6,3] ]给你一幅由 N N 矩阵表示的图像&#xff0c;其中每个像素的大小为 4 字节。请你设计一种算法&#xff0c;将图像…

java学习(148):三个参数的输入流

//3个参数读取二进制文件 import java.io.*;public class FileManage {public static void readBitFile(String filename){//1建立目标要读取的文件对象File filenew File( filename );//2基于目标对象建立输入流InputStream innull;if(file.exists()){//如果文件存在&#xff…

[剑指offer][JAVA][面试题第13题][机器人的运动][DFS][BFS]

【问题描述】 [中等] 地上有一个m行n列的方格&#xff0c;从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动&#xff0c;它每次可以向左、右、上、下移动一格&#xff08;不能移动到方格外&#xff09;&#xff0c;也不能进入行坐标和列坐标的数位之和…

ios php rsa,RSA 加密 iOS

在iOS端使用RSA加密的记录一、需求&#xff1a;SDK开发&#xff0c;使用RSA加密和后台进行数据交互&#xff0c;后台是PHP要求&#xff1a;1、post请求&#xff0c;客户端放公钥&#xff0c;私钥放后台2、发送数据&#xff1a;客户端的json数据—>RSA加密数据—>base64编…

java学习(149):字符输入流

import javax.imageio.IIOException; import java.io.*; import java.util.Date;//字符输入流 public class FileManagerChar {public static void readCharFile(File file){FileReader fileReadernull;//文本输入流if(file.exists()){try {fileReader new FileReader( file )…

java三年,Java开发三年,你不得不了解的JVM(一)

基本概念&#xff1a;JVM 是可运行 Java 代码的假想计算机 &#xff0c;包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收&#xff0c;堆 和 一个存储方法域。JVM 是运行在操作系统之上的&#xff0c;它与硬件没有直接的交互。运行过程&#xff1a;我们都知道Java源文件…