优美的排列 II
给你两个整数 n 和 k ,请你构造一个答案列表 answer ,该列表应当包含从 1 到 n 的 n 个不同正整数,并同时满足下述条件:假设该列表是 answer = [a1, a2, a3, … , an] ,那么列表 [|a1 - a2|, |a2 - a3|, |a3 - a4|, … , |an-1 - an|] 中应该有且仅有 k 个不同整数。
返回列表 answer 。如果存在多种答案,只需返回其中 任意一种 。
示例 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
提示:1 <= k < n <= 104
思路
-
当[1 2 3 4 5 6 7 8 9 …… n] 这样的话永远只有一个值 k = 1
-
当 [n 1 2 3 4 5 6 7 8……
n-1
] 时 存在两个值 k = 2 -
当[1 n 2 3 4 5 6 7 8……
n-1
]时 存在三个值 k = 3 -
当[n 1
n-1
2 3 4 5 6 7 8……n-2
] 时存在三个值 k = 4 -
当[ 1 n 2
n-1
3 4 5 6 7 8……n-2
] 时存在三个值 k = 5 -
那么以此类推
-
最多有k = n - 1 所以k 的取值范围 [1, n-1]
PS: 可以注意到 n在前在后key值不同,n在前为偶数,n 在后为奇数
package demo_3;
import com.alibaba.fastjson.JSON;
/**
* 类描述:优美的排列 II
*
* @author lwj
*/
public class Demo_3 {
public static final Integer n = 3;
public static final Integer k = 1;
public static void main(String[] args) {
if (n <= 0 || k <= 0 || k >= n) {
System.out.println("不存在");
return;
}
boolean nIsBefore = k % 2 == 0;
int number = k / 2;
System.out.println("number:" + number);
System.out.println("nIsBefore:" + nIsBefore);
int point = 0;
Integer[] res = new Integer[n];
for (int i = 0; i < n; i++) {
if (point < number && nIsBefore) {
res[i] = n - point;
i++;
}
res[i] = ++point;
if (point < number && nIsBefore) {
i++;
res[i] = n - point;
}
}
System.out.println(JSON.toJSONString(res));
}
}