优美的排列
给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件:
① 如果这个数组是 [a1, a2, a3, … , an] ,那么数组 [|a1 - a2|, |a2 - a3|, |a3 - a4|, … , |an-1 - an|] 中应该有且仅有 k 个不同整数;.
② 如果存在多种答案,你只需实现并返回其中任意一种.
示例 2:
输入: n = 3, k = 2
输出: [1, 3, 2]
解释: [1, 3, 2] 包含 3 个范围在 1-3 的不同整数, 并且 [2, 1] 中有且仅有 2 个不同整数: 1 和 2
解题思路
先来看一个例子:n=6的情况,这个时候k最大只能为5。
排列如下:
那么我们是怎么得到这个序列的呢?
先在第一位排上最小的数字,我们这里要做5个差,所以在第二位放上最大的那个数,第三位放上除去第一位的最小的数(即第二小的数),第四位放上第二大的数,依次向后可以得到答案。
那么对于n=4得到怎样的队列呢?
这两种排列有什么不同呢? 看最后两位,n=4的时候是降序,n=5的时候是升序。因为前四位已经构造了三种差值,如果之后只要再构造一种差值那就从第四位(数字5处)开始进行依次降序,差值恒为一。
这只是构造的一种办法,并不是唯一解
怎么知道该从什么处决定是降序还是升序呢?
依然从上面讲起,这里从奇偶来看,对于k=4,前四位采用有三个差值,后面再构造一种即可,因为数字5(第四位)是大值,所以后面降序。对于k=5,前五位有四种差值,再构造一位即可,但是由于数字3(第五位)是下降值,要构造不同的差值,下一位要升序(从当前位开始升序)