leetcode随机一题667优美的排列
给你两个整数 n 和 k ,请你构造一个答案列表 answer ,该列表应当包含从 1 到 n 的 n 个不同正整数,并同时满足下述条件:
假设该列表是 answer = [a1, a2, a3, … , an] ,那么列表 [|a1 - a2|, |a2 - a3|, |a3 - a4|, … , |an-1 - an|] 中应该有且仅有 k 个不同整数。
返回列表 answer 。如果存在多种答案,只需返回其中 任意一种 。
题意很清楚,给了1到n,n个数,返回一种符合相邻元素绝对值差只有k种的序列,考虑k的范围是1到n-1,k=1就是按升序或者降序排列,1,2,3…n,相邻的差都是1,那么k就是1,k最大是n-1,因为最大的差值也不过是n和1的差值,那么k表示的差值的种类从1到n-1就是n-1种,考虑什么时候能取到n-1的差值,那就是n和1相邻的时候,n-2的差值就是n和2相邻的时候,或者n-1和1相邻的时候,那么就有一种简单的构造的思路来做这道题,在顺序排列的基础上,根据要求的k对应的从后面取出大值,放到前面来,形成新的差值,每个大值能形成最多两个新的差值,比如把n放到前面来和1和2做差,得到新的差值n-1,n-2,也可以插到1的前面,只和1做差,形成新的一个差值n-1,这取决于k的奇偶性,k是奇数是,就从1的前面插入,让n只形成n-1一个新的差值,k是偶数时,从1的后面插入,形成n-1,n-2两个差值,接着n-1从2的后面插入,可以形成,n-3,n-4两个新的差值。
class Solution {
public:
vector<int> constructArray(int n, int k) {
int cnt=k/2;
vector<int>ans;
for(int i=1;i<=n-cnt;i++)ans.push_back(i);
int bias=(k&1)?1:0;
for(int i=n;i>=n-cnt+1;i--)
{
ans.insert(ans.begin()+bias+2*(n-i),i );
}
return ans;
}
};