LeetCode题目——667. 优美的排列 II

 

题目如下:

给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件:

① 如果这个数组是 [a1, a2, a3, ... , an] ,那么数组 [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] 中应该有且仅有 k 个不同整数;.

② 如果存在多种答案,你只需实现并返回其中任意一种.

 

示例 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

 

 

方法一:

从第i个点开始,循环k次,每次逆转i到n的元素,然后i+1。这样的话,每逆转一次,会产生一个不同的差值。代码如下:

class Solution:
    def constructArray(self, n: int, k: int) -> List[int]:
        res = list(range(1, n + 1))
        for i in range(1, k): 
            res[i:] = res[:i-1:-1]
        return res

 

方法二:

对前k个元素操作(奇数位从1开始往里面填数,1递增,偶数位从n开始往里面填数,n递减),剩余元素按顺序从小到大向后排列即可。代码如下:

class Solution:
    def constructArray(self, n: int, k: int) -> List[int]:
        arr, s, e, i = [], 1, n, 0
        while(s <= e):
            if((i < k and i % 2 == 0) or (i >= k and (k - 1) % 2 == 0)):
                arr.append(s)
                s += 1
            else:
                arr.append(e)
                e -= 1
            i += 1
        return arr

上一篇:Lua学习笔记6:C++和Lua的相互调用


下一篇:【ACWing】667. 游戏时间