问题描述:
- 给定两个整数
n
和 k
,构造一个答案列表 answer
,该列表应当包含从 1
到 n
的 n
个不同正整数,并同时满足下述条件:
- 假设该列表是
answer = [a1, a2, a3, ... , an]
,那么列表 [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|]
中应该有且仅有 k
个不同整数。 - 返回列表
answer
,如果存在多种答案,只需返回其中任意一种。
核心思路:
- 构造题,要找到规律才可以。
- 看了题解才有思路:
- 要确保差值有
k
种,只需要用 [0, k-1]
进行排列即可,[k, n-1]
是可以按顺序存放的。 - 换句话说,给定
n > k+1
和 k
的排列方式和给定 n = k+1
和 k
的排列方式是一样的;当 n > k+1
时,只需要取前 k+1
个数值获得 k
个不同差值,剩余的数字只需要桉顺序存放即可。
- 找到上述规律之后,构造的方法很多,下述代码是根据评论区的解说写出。
[0, k]
中,偶数下标填充 1, 2, 3,...
。[0, k]
中,奇数下标填充 k+1, k, k-1,...
。[k+1, n-1]
中,顺序填充 k+2, k+3, k+4,...
。
代码实现:
class Solution
{
public:
vector<int> constructArray(int n, int k)
{
vector<int> ans(n);
int left = 1, right = k+1;
for(int i = 0; i <= k; i += 2) ans[i] = left++;
for(int i = 1; i <= k; i += 2) ans[i] = right--;
for(int i = k+1; i < n; ++i) ans[i] = i+1;
return ans;
}
};