1718-构建字典序最大的可行序列
给你一个整数 n
,请你找到满足下面条件的一个序列:
- 整数
1
在序列中只出现一次。 2
到n
之间每个整数都恰好出现两次。- 对于每个
2
到n
之间的整数i
,两个i
之间出现的距离恰好为i
。
序列里面两个数 a[i]
和 a[j]
之间的 距离 ,我们定义为它们下标绝对值之差 |j - i|
。
请你返回满足上述条件中 字典序最大 的序列。题目保证在给定限制条件下,一定存在解。
一个序列 a
被认为比序列 b
(两者长度相同)字典序更大的条件是: a
和 b
中第一个不一样的数字处,a
序列的数字比 b
序列的数字大。比方说,[0,1,9,0]
比 [0,1,5,6]
字典序更大,因为第一个不同的位置是第三个数字,且 9
比 5
大。
示例 1:
**输入:** n = 3
**输出:** [3,1,2,3,2]
**解释:** [2,3,2,1,3] 也是一个可行的序列,但是 [3,1,2,3,2] 是字典序最大的序列。
示例 2:
**输入:** n = 5
**输出:** [5,3,1,4,3,5,2,4,2]
提示:
1 <= n <= 20
思路
一看这数据量就是暴力枚举了。
一开始走了弯路,思路有些偏差:一开始以为,因为要返回字典序最大的,那么可以从最大的数n开始找坑填,从第一位开始查找可以填的位置,如果在某一位置i有:arr[i]和arr[i+n]都未被占用(前提是n不为1,n为1单独讨论即可),那么这两个位置可以填上n,接着n递减,依次从头查找可以安放的位置,直到1也被安放完毕。但是,这个思路是错的…输入n为5时,会得到[5, 2, 4, 2, 3, 5, 4, 3, 1],而不是预期的[5,3,1,4,3,5,2,4,2]。一看,确实不能这么做,第一个4被放在了第三位,但是却比放在第四位的方案字典序更小。看来要转变思路。
看这个出错的用例,发现我们要确保高位的数字尽可能大,那么我们应该“优先用大的数字填高位(填高位是重点,即高位填好再填低位)”,而不是“优先填好大的数字(而不管它被放在哪里)”。这一点想清楚了,那么代码就好写了。整体是一个回溯的框架,具体实现见代码注释。这道题写了很久,注释也写的详细一点吧。
代码
1 | class Solution { |
Comments