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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章