1718. Construct the Lexicographically Largest Valid Sequence
Description
Given an integer n
, find a sequence that satisfies all of the following:
- The integer
1
occurs once in the sequence. - Each integer between
2
andn
occurs twice in the sequence. - For every integer
i
between2
andn
, the distance between the two occurrences ofi
is exactlyi
.
The distance between two numbers on the sequence, a[i]
and a[j]
, is the absolute difference of their indices, |j - i|
.
Return the lexicographically largest sequence. It is guaranteed that under the given constraints, there is always a solution.
A sequence a
is lexicographically larger than a sequence b
(of the same length) if in the first position where a
and b
differ, sequence a
has a number greater than the corresponding number in b
. For example, [0,1,9,0]
is lexicographically larger than [0,1,5,6]
because the first position they differ is at the third number, and 9
is greater than 5
.
Example 1:
Input: n = 3 Output: [3,1,2,3,2] Explanation: [2,3,2,1,3] is also a valid sequence, but [3,1,2,3,2] is the lexicographically largest valid sequence.
Example 2:
Input: n = 5 Output: [5,3,1,4,3,5,2,4,2]
Constraints:
1 <= n <= 20
Solution
construct-the-lexicographically-largest-valid-sequence.py
class Solution:
def constructDistancedSequence(self, n: int) -> List[int]:
res = [0] * (n * 2 - 1)
used = [0] * (n + 1)
def backtrack(i):
if i == len(res): return True
if res[i]: return backtrack(i + 1)
for k in range(n, 1, -1):
if used[k]: continue
if i + k < len(res) and res[i] == res[i + k] == 0:
res[i] = res[i + k] = k
used[k] = 1
if backtrack(i + 1): return True
res[i] = res[i + k] = 0
used[k] = 0
if not used[1]:
res[i] = 1
used[1] = 1
if backtrack(i + 1): return True
res[i] = 0
used[1] = 0
return False
backtrack(0)
return res