题目描述
给你两个整数 n
和 k
,请你构造一个答案列表 answer
,该列表应当包含从 1
到 n
的 n
个不同正整数,并同时满足下述条件:
- 假设该列表是
answer = [a1, a2, a3, ... , an]
,那么列表[|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|]
中应该有且仅有k
个不同整数。
返回列表 answer
。如果存在多种答案,只需返回其中 任意一种 。
示例 1:
1 | 输入:n = 3, k = 1 |
示例 2:
1 | 输入:n = 3, k = 2 |
提示:
1 <= k < n <= 10^4
题解
找规律
1 | public int[] constructArray(int n, int k) { |
- 时间复杂度: O(n)
- 空间复杂度: O(n)
构造
给定范围在 [1, n]
的 n
个数,当 直接升序/降序 排列时,相邻项差值为 1
,仅一种;而从 首位 开始按照 升序 间隔排列,次位 开始按照 降序 间隔排列(即排列为 [1, n, 2, n - 1, 3, ...]
)时,相邻差值会从 n - 1
开始递减至 1
,共 n - 1
种。
那么当我们需要构造 k
种序列时,我们可以先通过 直接升序 的方式构造出若干个 1
,然后再通过 间隔位分别升降序 的方式构造出从 k
到 1
的差值,共 k
个。
显然,我们需要 k + 1
个数来构造出 k
个差值。因此我们可以先从 1
开始,使用 n - (k + 1)
个数来 直接升序(通过方式一构造出若干个 1
),然后从 n - k
开始间隔升序排列,按照 n
开始间隔降序排列,构造出剩下的序列。
1 | public int[] constructArray(int n, int k){ |
- 时间复杂度: O(n)
- 空间复杂度: O(n)
参考资料
__END__