8 間牢房排成一排,每間牢房不是有人住就是空著。
每天,無論牢房是被占用或空置,都會根據以下規則進行更改:
(請注意,由於監獄中的牢房排成一行,所以行中的第乙個和最後乙個房間無法有兩個相鄰的房間。)
我們用以下方式描述監獄的當前狀態:如果第i
間牢房被占用,則cell[i]==1
,否則cell[i]==0
。
根據監獄的初始狀態,在n
天後返回監獄的狀況(和上述 n 種變化)。
示例 1:
輸入:cells = [0,1,0,1,1,0,0,1], n = 7輸出:[0,0,1,1,0,0,0,0]解釋:下表概述了監獄每天的狀況:示例 2:day 0: [0, 1, 0, 1, 1, 0, 0, 1]
day 1: [0, 1, 1, 0, 0, 0, 0, 0]
day 2: [0, 0, 0, 0, 1, 1, 1, 0]
day 3: [0, 1, 1, 0, 0, 1, 0, 0]
day 4: [0, 0, 0, 0, 0, 1, 0, 0]
day 5: [0, 1, 1, 1, 0, 1, 0, 0]
day 6: [0, 0, 1, 0, 1, 1, 0, 0]
day 7: [0, 0, 1, 1, 0, 0, 0, 0]
輸入:cells = [1,0,0,1,0,0,1,0], n = 1000000000輸出:[0,0,1,1,1,1,1,0]
cells.length == 8
cells[i]
的值為0
或1
1 <= n <= 10^9
看到題目第一眼就是利用迴圈去解決,判斷乙個數左右兩邊是否滿足條件,這種方法簡單易懂,但是當n較大的時候,計算時間會超時。
def prisonafterndays(cells,n):
import copy
k=len(cells)
while n>=0:
temp = copy.deepcopy(cells)
# print(temp)
for i in range(1,k-1):
if (temp[i-1]==0 and temp[i+1]==0) or (temp[i-1]==1 and temp[i+1]==1):
cells[i]=1
else:
cells[i]=0
cells[len(cells)-1]=0
# print(temp)
n-=1
return temp
於是,我們就應該換一種角度去思考問題,上面的一種方法是站在cells內元素的角度,我們還可以從牢房的狀態去思考,無論是第幾天,牢房的狀態最多只有2^6種可能,將每次出現的狀態進行編碼(num*2.num+1)和儲存,如果某一狀態出現第二次,那麼接下來的狀態就會在這兩個狀態之間迴圈,根據剩餘的迴圈次數對總的狀態進行取餘就可以得到答案。
def prisonafterndays( cells, n):
state =
cell =
for i in range(n):
num = 0
newcells = [0] * 8
for j in range(1, 7):
if cells[j - 1] == cells[j + 1]:
num *= 2
num += 1
newcells[j] = 1
else:
num *= 2
newcells[j] = 0
# print(num)
if num not in state:
cells = newcells
else:
# print(len(state),state.index(num))
# print(state)
step = len(state) - state.index(num)
laststep = n - 1 - i
k = laststep % step
return cell[state.index(num) + k]
return cells
957 N 天後的牢房
8 間牢房排成一排,每間牢房不是有人住就是空著。每天,無論牢房是被占用或空置,都會根據以下規則進行更改 如果一間牢房的兩個相鄰的房間都被占用或都是空的,那麼該牢房就會被占用。否則,它就會被空置。請注意,由於監獄中的牢房排成一行,所以行中的第乙個和最後乙個房間無法有兩個相鄰的房間。我們用以下方式描述監...
Leetcode 957 N天後的牢房
8 間牢房排成一排,每間牢房不是有人住就是空著。每天,無論牢房是被占用或空置,都會根據以下規則進行更改 如果一間牢房的兩個相鄰的房間都被占用或都是空的,那麼該牢房就會被占用。否則,它就會被空置。請注意,由於監獄中的牢房排成一行,所以行中的第乙個和最後乙個房間無法有兩個相鄰的房間。我們用以下方式描述監...
LeetCode 957 N天後的牢房
題目描述 8 間牢房排成一排,每間牢房不是有人住就是空著。每天,無論牢房是被占用或空置,都會根據以下規則進行更改 如果一間牢房的兩個相鄰的房間都被占用或都是空的,那麼該牢房就會被占用。否則,它就會被空置。請注意,由於監獄中的牢房排成一行,所以行中的第乙個和最後乙個房間無法有兩個相鄰的房間。我們用以下...