返回

LeetCode 667 优美的排列 II:循序渐进剖析构造规则

后端







**导言:** 

优美的排列是 LeetCode 上一道中等难度的编程题,其核心目的是给定两个整数 n 和 k,构造一个包含从 1 到 n 的 n 个不同正整数的排列 answer,同时满足以下条件:

* 对于任意 1 ≤ i ≤ n,都有 answer[i] 不是 i,且 answer[answer[i]] 不是 i。

这道题乍一看可能有些抽象难懂,但通过图解和循序渐进的分析,我们可以轻松地理解其背后的构造规则。

**算法思路:** 

解决这道题的关键在于巧妙地利用回溯算法。回溯算法是一种常用的搜索算法,它通过穷举所有可能的排列组合,并逐步排除不满足条件的排列,最终找到满足条件的排列。

**具体步骤:** 

1. 初始化一个空排列 answer。
2. 从 1 开始,依次尝试将每个数字 i 加入 answer。
3. 加入数字 i 后,检查 answer 是否满足条件:
   * 如果 answer[i] != i && answer[answer[i]] != i,则说明满足条件,继续执行下一步。
   * 否则,回溯到上一步,尝试加入下一个数字。
4. 重复步骤 2 和 3,直到构造出满足条件的排列 answer。

**图解示例:** 

假设 n = 4,k = 2。

                           (1)
                        /        \
                    (1, 2)    (1, 3)
                   /     \     /     \
                (1, 2, 3) (1, 2, 4) (1, 3, 2) (1, 3, 4)

从图中可以看出,对于 n = 4k = 2,存在两个满足条件的排列:(1, 3, 2, 4) 和 (1, 4, 2, 3)。

**示例代码:** 

```python
def constructArray(n, k):
    """
    :type n: int
    :type k: int
    :rtype: List[int]
    """
    answer = []
    for i in range(1, n - k):
        answer.append(i)
    for i in range(n - k, n + 1):
        if i == n - k:
            answer.append(n)
            answer.append(i)
        else:
            answer.append(i)
            answer.append(n - k)
    return answer

总结:

通过图解和循序渐进的分析,我们深入理解了 LeetCode 667 优美的排列 II 的构造规则和解题思路。利用回溯算法,我们可以高效地构造出满足条件的排列,解决这道中等难度的编程题。