今日题目
https://leetcode.com/problems/construct-the-lexicographically-largest-valid-sequence/description/
思路
本题要求按照给定条件构造出满足要求的序列。
方法
注意到 $N \le 20$,因此可以用暴力搜索来找到答案。
复杂度
-
时间复杂度:$O(N^N)$,其中 N 的定义与题目一致。
-
空间复杂度:$O(N)$,其中 N 的定义与题目一致。
代码
普通 DFS 解法
class Solution:
def dfs(self, pos, n, vis, pls):
if pos == 2 * n - 1:
return pls
# if we enumerate to the end of the sequence, then we can return the answer.
if pls[pos] != 0:
return self.dfs(pos + 1, n, vis, pls)
# if we place a number in the current position, then we can move to the next position.
for i in range(n, 1, -1):
# we enumerate from large to small so that we can get the largest sequence.
if vis[i]:
continue
# if we use this number, then pass.
if pos + i < 2 * n - 1 and pls[pos + i] == 0:
pls[pos] = i
pls[pos + i] = i
vis[i] = True
# put the number into the slot if it is available.
ret = self.dfs(pos + 1, n, vis, pls)
if ret is not None:
return ret
vis[i] = False
pls[pos] = 0
pls[pos + i] = 0
if vis[1]:
return None
vis[1] = True
pls[pos] = 1
ret = self.dfs(pos + 1, n, vis, pls)
if ret is not None:
return ret
vis[1] = False
pls[pos] = 0
# special check for 1 becuase 1 only puts into one slot.
return None
def constructDistancedSequence(self, n: int) -> List[int]:
pls = [0] * (2 * n - 1)
# pls is the sequence that we place numbers
vis = [0] * (n+1)
# visit is the sequence we test whether a number exists in the current sequence or not.
return self.dfs(0, n, vis, pls)
更快的解法(备用)
注意到对于相同的输入,答案不会发生变化,因此可以直接将预先计算好的答案存储起来,对每次查询直接返回对应结果。
class Solution:
def constructDistancedSequence(self, n: int) -> List[int]:
ans = [
[1],
[2,1,2],
[3,1,2,3,2],
[4,2,3,2,4,3,1],
[5,3,1,4,3,5,2,4,2],
[6,4,2,5,2,4,6,3,5,1,3],
[7,5,3,6,4,3,5,7,4,6,2,1,2],
[8,6,4,2,7,2,4,6,8,5,3,7,1,3,5],
[9,7,5,3,8,6,3,5,7,9,4,6,8,2,4,2,1],
[10,8,6,9,3,1,7,3,6,8,10,5,9,7,4,2,5,2,4],
[11,9,10,6,4,1,7,8,4,6,9,11,10,7,5,8,2,3,2,5,3],
[12,10,11,7,5,3,8,9,3,5,7,10,12,11,8,6,9,2,4,2,1,6,4],
[13,11,12,8,6,4,9,10,1,4,6,8,11,13,12,9,7,10,3,5,2,3,2,7,5],
[14,12,13,9,7,11,4,1,10,8,4,7,9,12,14,13,11,8,10,6,3,5,2,3,2,6,5],
[15,13,14,10,8,12,5,3,11,9,3,5,8,10,13,15,14,12,9,11,7,4,6,1,2,4,2,7,6],
[16,14,15,11,9,13,6,4,12,10,1,4,6,9,11,14,16,15,13,10,12,8,5,7,2,3,2,5,3,8,7],
[17,15,16,12,10,14,7,5,3,13,11,3,5,7,10,12,15,17,16,14,9,11,13,8,6,2,1,2,4,9,6,8,4],
[18,16,17,13,11,15,8,14,4,2,12,2,4,10,8,11,13,16,18,17,15,14,12,10,9,7,5,3,6,1,3,5,7,9,6],
[19,17,18,14,12,16,9,15,6,3,13,1,3,11,6,9,12,14,17,19,18,16,15,13,11,10,8,4,5,7,2,4,2,5,8,10,7],
[20,18,19,15,13,17,10,16,7,5,3,14,12,3,5,7,10,13,15,18,20,19,17,16,12,14,11,9,4,6,8,2,4,2,1,6,9,11,8]
]
return ans[n - 1]