题目描述
给你两个整数 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__