n天後的牢房

2021-09-03 08:22:06 字數 2312 閱讀 7861

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]解釋:下表概述了監獄每天的狀況:

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]

示例 2:

輸入:cells = [1,0,0,1,0,0,1,0], n = 1000000000輸出:[0,0,1,1,1,1,1,0]

cells.length == 8cells[i]的值為011 <= 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 間牢房排成一排,每間牢房不是有人住就是空著。每天,無論牢房是被占用或空置,都會根據以下規則進行更改 如果一間牢房的兩個相鄰的房間都被占用或都是空的,那麼該牢房就會被占用。否則,它就會被空置。請注意,由於監獄中的牢房排成一行,所以行中的第乙個和最後乙個房間無法有兩個相鄰的房間。我們用以下...