算法練習每日一題:優美的排列 II

667. 優美的排列 II

中文版的翻譯要仔細看,不小心會引導歧路上

給定兩個整數 n 和 k,你需要實現一個數組,這個數組包含從 1 到 n 的 n 個不同整數,同時滿足以下條件:

① 如果這個數組是 [a1, a2, a3, … , an] ,那麼數組 [|a1 - a2|, |a2 - a3|, |a3 - a4|, … , |an-1 - an|] 中應該有且僅有 k 個不同整數;.

此處意思爲列表中的元素,有 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

3-1=2 差值爲2, 3-2=1,差值爲1, 就是2中差值

  • 提示:

    n 和 k 滿足條件 1 <= k < n <= 104.

鏈接:https://leetcode-cn.com/problems/beautiful-arrangement-ii

題解:

  1. 初始化爲 1 到 n 的 list,此時所有的差值爲1,也只有 1 種差值
  • 歸納枚舉方法,通過找規律列決出某一種符合條件的列表,如 l[k:] 的元素逆序後插入到 l[:k]的每個元素後;
  • 翻轉元素方法:從第二位到末位開始不停翻轉,翻轉一次增加一種差值
"""列表翻轉——切片: 既每次講rst[i:]的元素逆序一次
In [8]: r=[1,2,3,4,5,6,7,8]
In [19]: r[2:]
Out[19]: [3, 4, 5, 6, 7, 8]
In [18]: r[:1:-1]
Out[18]: [8, 7, 6, 5, 4, 3]
In [20]: r[2:] = r[:1:-1]

In [21]: r
Out[21]: [1, 2, 8, 7, 6, 5, 4, 3]
"""
class Solution:
    def constructArray(self, n: int, k: int) -> List[int]:
        rst = list(range(1,n+1))
        for i in range(1,k):
            rst[i:] = rst[:i-1:-1] # 翻轉,既每次講rst[i:]的元素逆序一次,
            
        return rst
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章