给定两个整数 n
和 k
,你需要实现一个数组,这个数组包含从 1
到 n
的 n
个不同整数,同时满足以下条件:
① 如果这个数组是 [a1, a2, a3, ... , an] ,那么数组 [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] 中应该有且仅有 k 个不同整数;.
② 如果存在多种答案,你只需实现并返回其中任意一种.
示例 1:
输入: n = 3, k = 1 输出: [1, 2, 3] 解释: [1, 2, 3] 包含 3 个范围在 1-3 的不同整数, 并且 [1, 1] 中有且仅有 1 个不同整数 : 1
示例 2:
输入: n = 3, k = 2 输出: [1, 3, 2] 解释: [1, 3, 2] 包含 3 个范围在 1-3 的不同整数, 并且 [2, 1] 中有且仅有 2 个不同整数: 1 和 2
解题思路:我们要从排列顺序中去找寻规律,所以我们先假设n=7,将所有k<7的符合要求的一种排列找出来,从其中找出规律
k=1 :1 2 3 4 5 6 7
k=2: 1 2 3 4 5 7 6
k=3: 1 2 3 4 7 5 6
k=4: 1 2 3 7 4 6 5
k=5: 1 2 7 3 6 4 5
k=6: 1 7 2 6 3 5 4
代码如下:
class Solution {
public:
vector<int> constructArray(int n, int k) {
vector<int> res(n, 0);
int index=0;
for(int i=1; i<n-k; i++)
res[index++] = i;
for(int i=0; i<=k; i++)
res[index++] = (i%2==0) ? (n-k+i/2) : (n-i/2);
return res;
}
};