• Leetcode 667. 优美的排列 II


    1.题目描述

    给你两个整数 n k ,请你构造一个答案列表 answer ,该列表应当包含从 1nn 个不同正整数,并同时满足下述条件:

    • 假设该列表是 answer = [a1, a2, a3, ... , an] ,那么列表 [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] 中应该有且仅有 k 个不同整数。

    返回列表 answer 。如果存在多种答案,只需返回其中 任意一种


    输入:n = 3, k = 1
    输出:[1, 2, 3]
    解释:[1, 2, 3] 包含 3 个范围在 1-3 的不同整数,并且 [1, 1] 中有且仅有 1 个不同整数:1


    输入:n = 3, k = 2
    输出:[1, 3, 2]
    解释:[1, 3, 2] 包含 3 个范围在 1-3 的不同整数,并且 [2, 1] 中有且仅有 2 个不同整数:1 和 2


    提示:

    • 1 <= k < n <= 10^4

    2.思路分析

    • k = 1 k=1 k=1 时,将 1 ∼ n 1 \sim n 1n 按照 [ 1 , 2 , ⋯   , n ] [1, 2, \cdots, n] [1,2,,n]] 的顺序进行排列,那么相邻的差均为 1,满足 k = 1 k=1 k=1 的要求。

    • k = n − 1 k=n-1 k=n1 时,将 1 ∼ n 1 \sim n 1n 按照 [ 1 , n , 2 , n − 1 , 3 , ⋯   ] [1, n, 2, n-1, 3, \cdots] [1,n,2,n1,3,]的顺序进行排列,那么相邻的差从 n − 1 n-1 n1 开始,依次递减 1 1 1。这样一来,所有从 1 1 1 n − 1 n-1 n1 的差值均出现一次,满足 k = n − 1 k=n-1 k=n1 的要求。

    • 对于其它的一般情况,可以将这两种特殊情况进行合并,即列表的前半部分相邻差均为 1,后半部分相邻差从 k k k 开始逐渐递减到 1,这样从 1 到 k k k 的差值均出现一次,对应的列表即为:
      [ 1 , 2 , ⋯ , n − k , n , n − k + 1 , n − 1 , n − k + 2 , ⋯ ] [1,2,⋯,n−k,n,n−k+1,n−1,n−k+2,⋯] [1,2,,nk,n,nk+1,n1,nk+2,]

    3.代码实现

    class Solution:
        def constructArray(self, n: int, k: int) -> List[int]:
            # 前半部分差值为1
            answer = list(range(1, n - k))
            # 后半部分要求右k-1中不同差值
            i, j = n - k, n
            while i <= j:
                answer.append(i)
                if i != j:
                    answer.append(j)
                i, j = i + 1, j - 1
            return answer
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    复杂度分析

    • 时间复杂度:O(n)。
    • 空间复杂度:O(1),这里不计入返回值需要的空间。

    **参考:**https://leetcode.cn/problems/beautiful-arrangement-ii/solution/you-mei-de-pai-lie-ii-by-leetcode-soluti-qkrs/

  • 相关阅读:
    实现实时美颜:主播直播美颜SDK的技术细节
    SpringBoot_minio sdk使用自签名https证书错误处理
    DataStructure篇:RBT(红黑树)
    【游戏专区】飞机大战
    【操作系统】内存管理(三)—— 内存的分配与回收(1)
    算法分析与设计CH8:线性时间的排序——计数排序、基数排序、桶排序
    大数据ClickHouse进阶(二十六):ClickHouse数据备份
    互联网采集数据有哪几种常见的方法?
    rust编程-通用编程概念(chapter 3.1)
    linux--进程通信--管道通信
  • 原文地址:https://blog.csdn.net/weixin_44852067/article/details/126761657