Skip to content

Latest commit

 

History

History
62 lines (47 loc) · 1.88 KB

0667._Beautiful_Arrangement_II.md

File metadata and controls

62 lines (47 loc) · 1.88 KB

667. Beautiful Arrangement II

难度: Medium

刷题内容

原题连接

内容描述

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%

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