Medium草稿★★★★O(n * n!) 時間 · O(n) 空間
BacktrackingArray
Patterns🌿 回溯
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

46PermutationsBacktrackingMediumBacktracking

給定一個不含重複數字的整數陣列 nums,回傳其所有可能的排列。可以任意順序回傳答案。

Example:

Input: nums = [1,2,3] Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

Intuition

TIP

核心思路:排列和子集/組合的差異在於「順序有關」,因此每層都從頭開始選,但不能選已選過的元素。

Approaches

1. Backtracking + Used Array — O(n * n!) / O(n)
  • Idea: 用 boolean 陣列記錄哪些數已被使用,每層遍歷所有數,跳過已用的
  • Time: O(n * n!) - n! 個排列,每個長度 n
  • Space: O(n) - 遞迴深度 + used 陣列
class Solution {
    fun permute(nums: IntArray): List<List<Int>> {
        val result = mutableListOf<List<Int>>()
        val current = mutableListOf<Int>()
        val used = BooleanArray(nums.size)

        fun backtrack() {
            if (current.size == nums.size) {
                result.add(ArrayList(current))
                return
            }

            for (i in nums.indices) {
                if (used[i]) continue
                used[i] = true
                current.add(nums[i])
                backtrack()
                current.removeAt(current.lastIndex)
                used[i] = false
            }
        }

        backtrack()
        return result
    }
}
⭐ 2. Backtracking + Swap — O(n * n!) / O(n)
  • Idea: 用 swap 代替 used 陣列。將 index 左邊視為「已選」,右邊視為「可選」,每次從右邊挑一個 swap 到當前位置
  • Time: O(n * n!)
  • Space: O(n) - 遞迴深度(不需要額外 used 陣列)
class Solution {
    fun permute(nums: IntArray): List<List<Int>> {
        val result = mutableListOf<List<Int>>()

        fun backtrack(start: Int) {
            if (start == nums.size) {
                result.add(nums.toList())
                return
            }

            for (i in start until nums.size) {
                nums[start] = nums[i].also { nums[i] = nums[start] }
                backtrack(start + 1)
                nums[start] = nums[i].also { nums[i] = nums[start] }
            }
        }

        backtrack(0)
        return result
    }
}

🔑 Takeaways

Ladders 看全部 →

🔀

排列(回溯)

全排列與含重複的去重。

  1. 1
  2. 2#47Permutations IIMedium含重複 → 排序後同層去重