0 and self.contain_opposite(cur, q): q.remove(opp) q.append(cur) else: return "Radiant" if cur is "R" else "Dire" def contain_opposite(self, s, q): if len(q) is 0: return False if len(set(q))>1: return True return q[0] is not s"> 0 and self.contain_opposite(cur, q): q.remove(opp) q.append(cur) else: return "Radiant" if cur is "R" else "Dire" def contain_opposite(self, s, q): if len(q) is 0: return False if len(set(q))>1: return True return q[0] is not s"> 0 and self.contain_opposite(cur, q): q.remove(opp) q.append(cur) else: return "Radiant" if cur is "R" else "Dire" def contain_opposite(self, s, q): if len(q) is 0: return False if len(set(q))>1: return True return q[0] is not s">
class Solution:
def predictPartyVictory(self, senate: str) -> str:
q = list(senate)
while len(q)>0:
cur = q.pop(0)
opp = "R" if cur is "D" else "D"
if len(q)>0 and self.contain_opposite(cur, q):
q.remove(opp)
q.append(cur)
else:
return "Radiant" if cur is "R" else "Dire"
def contain_opposite(self, s, q):
if len(q) is 0:
return False
if len(set(q))>1:
return True
return q[0] is not s
優化時間複雜度
使用兩個 queue,一個保存 R 隊的 index,另一個保存 D 隊的 index
然後兩隊 queue 最上面那個持續對抗,每一輪各派一個,index小的獲勝,勝利方在queue後面push進去最新的 index(表示該議員下一輪的 index)
直到兩個 queue 有一個為空,判斷結果
class Solution:
def predictPartyVictory(self, senate: str) -> str:
radiant_q, dire_q = [], []
senate_list = list(senate)
for i in range(len(senate_list)):
if senate_list[i] is "R":
radiant_q.append(i)
else:
dire_q.append(i)
next_round = len(senate)
while radiant_q and dire_q:
if radiant_q[0] < dire_q[0]:
radiant_q.append(next_round)
else:
dire_q.append(next_round)
next_round += 1
radiant_q.pop(0)
dire_q.pop(0)
return "Radiant" if radiant_q else "Dire"
TC, SC = O(n)