# 667. Beautiful Arrangement II

**<font color=red>难度: Medium</font>**

## 刷题内容

> 原题连接

* https://leetcode.com/problems/beautiful-arrangement-ii/

> 内容描述

```
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 and k are in the range 1 <= k < n <= 104.
```

## 解题方案

> 思路 1
******- 时间复杂度: O(N)******- 空间复杂度: O(1)******


想要正好有k个不同的数字，注意题目说的是k个不同的绝对值

我们发现：
- 1个不同的就是[1,2,3,4....n]
- 2个不同的就是[1,2,3,4....n-3,n-2,n,n-1]
- 3个不同的就是[1,2,3,4....n-4,n-3,n,n-2,n-1]
- ...
- ...
- n个不同的就是[1,2,3...n-k-1, 剩下最小，剩下最大，剩下第二小，剩下第二大.....]，即[1,2,3...n-k-1, n-k, n, n-k+1，n-1,.....]

beats 99.15%

```python
class Solution(object):
    def constructArray(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: List[int]
        """
        res = [i for i in range(1, n-k)]
        for i in range(k+1): # [1,2,3...n-k-1, 剩下最小，剩下最大，剩下第二小，剩下第二大.....]
            cur = n - i // 2 if i & 1 else n - k + i // 2
            res.append(cur)
        return res
```
