Given two integers n
and k
, you need to construct a list which contains n
different positive integers ranging from 1
to n
and obeys the following requirement:
Suppose this list is [a1, a2, a3, ... , an], then the list [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] has exactly k
distinct integers.
If there are multiple answers, print any of them.
Example 1:
Input: n = 3, k = 1 Output: [1, 2, 3] Explanation: The [1, 2, 3] has three different positive integers ranging from 1 to 3, and the [1, 1] has exactly 1 distinct integer: 1.
Example 2:
Input: n = 3, k = 2 Output: [1, 3, 2] Explanation: The [1, 3, 2] has three different positive integers ranging from 1 to 3, and the [2, 1] has exactly 2 distinct integers: 1 and 2.
Note:
- The
n
andk
are in the range 1 <= k < n <= 104.
给两个数字n和k,要求你输出一个数组,数组符合如下要求:
长度为n,包含1到n的全部整数。数组中相邻两个数字之差的绝对值恰好有k种。
显然k的最大值只能是n-1.如果是n-1应该怎么排呢?n个数任取两个,两个数之差的绝对值有n-1种,只能让着n-1种全部出现。
举例,n=5 k=4. 绝对值有4种,即1-4,显然全部出现。
差的绝对值为4: 1和5,只有这一种情况,那么当前数组[1,5]
差的绝对值为3:[1,5,2]
差的绝对值为2:[1,5,2,4]
差的绝对值为1: [1,5,2,4,3]
显然,每次取剩余数字中最大的或者最小的放进去,相当于初始化一个数组[1,2,3……n],然后从两边取值放到结果数组,最后剩下的中间的放到结果数组即可。
代码如下:
class Solution(object):
def constructArray(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[int]
"""
res = []
max_num, min_num = n, 1
for i in range(1, k+1):
if i % 2 == 0:
res.append(max_num)
max_num -= 1
else:
res.append(min_num)
min_num += 1
if k % 2 == 0:
for i in range(max_num,min_num-1,-1):
res.append(i)
else:
for i in range(min_num,max_num+1,1):
res.append(i)
return res