日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][第289题][生命游戏] 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【問題描述】

根據(jù) 百度百科 ,生命游戲,簡稱為生命,是英國數(shù)學(xué)家約翰·何頓·康威在 1970 年發(fā)明的細(xì)胞自動機。給定一個包含 m × n 個格子的面板,每一個格子都可以看成是一個細(xì)胞。每個細(xì)胞都具有一個初始狀態(tài):1 即為活細(xì)胞(live),或 0 即為死細(xì)胞(dead)。每個細(xì)胞與其八個相鄰位置(水平,垂直,對角線)的細(xì)胞都遵循以下四條生存定律:如果活細(xì)胞周圍八個位置的活細(xì)胞數(shù)少于兩個,則該位置活細(xì)胞死亡; 如果活細(xì)胞周圍八個位置有兩個或三個活細(xì)胞,則該位置活細(xì)胞仍然存活; 如果活細(xì)胞周圍八個位置有超過三個活細(xì)胞,則該位置活細(xì)胞死亡; 如果死細(xì)胞周圍正好有三個活細(xì)胞,則該位置死細(xì)胞復(fù)活; 根據(jù)當(dāng)前狀態(tài),寫一個函數(shù)來計算面板上所有細(xì)胞的下一個(一次更新后的)狀態(tài)。下一個狀態(tài)是通過將上述規(guī)則同時應(yīng)用于當(dāng)前狀態(tài)下的每個細(xì)胞所形成的,其中細(xì)胞的出生和死亡是同時發(fā)生的。示例:輸入: [[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. 時間復(fù)雜度:O(N) 空間復(fù)雜度:O(N)

@leedcodeJerry

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++) {// 拿到當(dāng)前位置周圍活細(xì)胞數(shù)量int cnt = countAlive(i, j);// 1. 活細(xì)胞周圍八個位置有兩個或三個活細(xì)胞,下一輪繼續(xù)活if (board[i][j] == 1 && (cnt == 2 || cnt == 3)) board[i][j] = 3;// 2. 細(xì)胞本來死的,周圍有三個活著的,下一輪復(fù)活了if (board[i][j] == 0 && cnt == 3) board[i][j] = 2;}}// 更新結(jié)果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,代表是死的,之前死或者之后死都不會算進(jìn)去// 如果這個位置為 1,代表是是活得,并且是還沒遍歷到,需要算進(jìn)去// 如果這個位置為 2,代表是是活得,修改過了,并且之前是死的,不需要算進(jìn)去// 如果這個位置為 3,代表是是活得,修改過了,并且之前是活的,需要算進(jìn)去cnt += (board[nx][ny] & 1);}return cnt;} } #### 【總結(jié)】 **1.方向技巧**

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

**2.this 關(guān)鍵字用法** [[Java]中[this][super]用法總結(jié)](https://blog.csdn.net/dadongwudi/article/details/105264127)this 是自身的一個對象,代表對象本身,可以理解為:指向?qū)ο蟊旧淼囊粋€指針。 2.1 普通的直接引用 2.2 形參與成員名字重名,用 this 來區(qū)分

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));
}
}

運行結(jié)果:

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

可以看到,這里age是GetAge成員方法的形參,this.age是Person類的成員變量。

2.3 引用構(gòu)造函數(shù) this(參數(shù)):調(diào)用本類中另一種形式的構(gòu)造函數(shù)(應(yīng)該為構(gòu)造函數(shù)中的第一條語句)。**3.手撕代碼 例子模擬一遍對于題目的理解很重要**

總結(jié)

以上是生活随笔為你收集整理的[Leedcode][JAVA][第289题][生命游戏]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。