667. 优美的排列 II
难度中等78收藏分享切换为英文接收动态反馈
给定两个整数 n
和 k
,你需要实现一个数组,这个数组包含从 1
到 n
的 n
个不同整数,同时满足以下条件:
① 如果这个数组是 [a1, a2, a3, … , an] ,那么数组 [|a1 - a2|, |a2 - a3|, |a3 - a4|, … , |an-1 - an|] 中应该有且仅有 k 个不同整数;.
② 如果存在多种答案,你只需实现并返回其中任意一种.
示例 1:
1 | 输入: n = 3, k = 1 |
示例 2:
1 | 输入: n = 3, k = 2 |
提示:
n
和k
满足条件 1 <= k < n <= 104.
找规律
当 k=n-1 时,有效的构造是 [1, n, 2, n-1, 3, n-2, ….]。我们需要 n-1 个的不同的相邻整数差,这意味着我们需要 1 和 n 相邻;然后,我们需要 n-2 的差异以此类推。
另外,当 k=1 时,有效的构造是 [1, 2, 3, …, n]。所以我们有一个构造,我们可以将 k=n-1 和 k=1 的构造方法结合起来。我们可以先构造 k=1 的序列 [1,2,…,n-k-1],这样剩下需要构造的序列的长度 n 实际上就是 k+1,然后用 k=n-1 方法完成构造。
例如,当 n=6 和 k=3 时,我们将数组构造为 [1, 2, 3, 6, 4, 5]。这包括两部分:构造 [1,2] 和构造 [1,4,2,3],其中每个元素都添加了 2(即 [3,6,4,5])。
算法:
和上面说的一样,先构造 [1,2,…,n-k-1]。剩下的 k+1 个元素是 [n-k,n-k+1,…,n],我们将按头尾顺序交替写入。
1 | class Solution { |
参考文献
作者:LeetCode
链接来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。