LeetCode Python 289 生命遊戲

2021-09-19 06:25:32 字數 3057 閱讀 5571

給定乙個包含 m × n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞具有乙個初始狀態 live(1)即為活細胞, 或 dead(0)即為死細胞。每個細胞與其八個相鄰位置(水平,垂直,對角線)的細胞都遵循以下四條生存定律:

如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡;

如果活細胞周圍八個位置有兩個或三個活細胞,則該位置活細胞仍然存活;

如果活細胞周圍八個位置有超過三個活細胞,則該位置活細胞死亡;

如果死細胞周圍正好有三個活細胞,則該位置死細胞復活;

根據當前狀態,寫乙個函式來計算面板上細胞的下乙個(一次更新後的)狀態。下乙個狀態是通過將上述規則同時應用於當前狀態下的每個細胞所形成的,其中細胞的出生和死亡是同時發生的。

示例:

輸入: 

[  [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的搜尋可以得到 八個鄰居裡 1的個數,然後根據題目要求來判斷下一輪是0還是1,

利用兩個陣列,alivex和alivey來記錄下一輪哪些格仔是活細胞(1),

比如如果alivex = [0,2,2,3], alivey = [0,0,1,1] 就代表下一輪[0, 0], [2,0], [2,1], [3,1]是1,其他位置上全部是0。

class solution(object):

def gameoflife(self, board):

""":type board: list[list[int]]

:rtype: void do not return anything, modify board in-place instead.

"""m = len(board)

if m == 0:

return board

n = len(board[0])

if n == 0:

return board

alivex = list()

alivey = list()

def neibor(x, y): #統計八個鄰居裡有幾個是活細胞(1)

dx = [1, -1, 0, 0, 1, -1, -1, 1]

dy = [0, 0, 1, -1, 1, -1, 1, -1]

cnt = 0

for k in range(8):

xx = x + dx[k]

yy = y + dy[k]

if 0 <= xx < m and 0 <= yy < n and board[xx][yy] == 1:

cnt += 1

return cnt

for i in range(m):

for j in range(n):

cnt = neibor(i, j)

# print i, j, cnt

if (board[i][j] == 1 and 2 <= cnt <= 3) or (board[i][j] == 0 and cnt == 3):

alivecnt = 0

for i in range(m):

for j in range(n):

board[i][j] = 0

if alivecnt < len(alivex):

if alivex[alivecnt] == i and alivey[alivecnt] == j:

board[i][j] = 1

alivecnt += 1

return board

下面的寫於2023年09月06日20:39:30,用了乙個集合而不是兩個陣列來得到新的board

class solution(object):

def gameoflife(self, board):

""":type board: list[list[int]]

:rtype: none do not return anything, modify board in-place instead.

"""if not board or not board[0]:

return

m, n = len(board), len(board[0])

dx = [1, -1, 0, 0, 1, 1, -1, -1]

dy = [0, 0, 1, -1, 1, -1, 1, -1]

def countlivecells(x0, y0):

cnt = 0

for k in range(8):

x = x0 + dx[k]

y = y0 + dy[k]

if 0 <= x < m and 0 <= y < n and board[x][y] == 1:

cnt += 1

return cnt

livecellset = set()

for i in range(m):

for j in range(n):

if board[i][j] == 1 and countlivecells(i, j) in [2, 3]:

livecellset.add((i, j))

elif board[i][j] == 0 and countlivecells(i, j) == 3:

livecellset.add((i, j))

for i in range(m):

for j in range(n):

if (i, j) in livecellset:

board[i][j] = 1

else:

board[i][j] = 0

leetcode,python2 最大子序和

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。class so...

LeetCode Python 打家劫舍I

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...

leetcode Python編碼練習

貪心演算法 1.環形路上有n個加油站,第i個加油站的汽油量是gas i 你有一輛車,車的油箱可以無限裝汽油。從加油站i走到下乙個加油站 i 1 花費的油量是cost i 你從乙個加油站出發,剛開始 的時候油箱裡面沒有汽油。求從哪個加油站出發可以在環形路上走一圈。返回加油站的下標,如果沒有答案的話返回...