原地算法:在計算機科學中,一個原地算法(in-place algorithm)是一種使用小的,固定數量的額外之空間來轉換資料的算法。當算法執行時,輸入的資料通常會被要輸出的部份覆蓋掉。不是原地算法有時候稱為非原地(not-in-place)或不得其所(out-of-place)。
題目:
生命游戲,簡稱為生命,是英國數學家約翰·何頓·康威在1970年發明的細胞自動機。
給定一個包含 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] ]
進階:
- 你可以使用原地算法解決本題嗎?請注意,面板上所有格子需要同時被更新:你不能先更新某些格子,然后使用它們的更新后的值再更新其他格子。
- 本題中,我們使用二維數組來表示面板。原則上,面板是無限的,但當活細胞侵占了面板邊界時會造成問題。你將如何解決這些問題?
class Solution(object): def gameOfLife(self, board): """ :type board: List[List[int]] :rtype: void Do not return anything, modify board in-place instead. """ x = len(board) y = len(board[0]) temp = [0] * y for i in range(x): leftTop = 0 for j in range(y): t = board[i][j] count = 0 #上面三個 if leftTop == 1: #lefttop count += 1 if temp[j] == 1: #top count += 1 if j + 1 < y and temp[j + 1] == 1: #righttop count += 1 #側面兩個 if j - 1 >= 0 and temp[j - 1] == 1: count += 1 if j + 1 < y and board[i][j + 1]: count += 1 #下面三個 if i + 1 < x and j - 1 >= 0 and board[i + 1][j - 1] == 1: #leftBottom count += 1 if i + 1 < x and board[i + 1][j] == 1: count += 1 if i + 1 < x and j + 1 < y and board[i + 1][j + 1] == 1: count += 1 leftTop = temp[j] temp[j] = board[i][j] if board[i][j] == 1: if count < 2: board[i][j] = 0 elif count == 2: board[i][j] = 1 elif count == 3: board[i][j] = 1 else: board[i][j] = 0 else: if count == 3: board[i][j] = 1
代碼的簡潔程度沒那么高,我是順着自己的一步一步思路寫下來,沒有做什么優化!看着效果不錯,就懶得改了,哈哈哈哈哈!