LeetCode 46 全排列 字典序解法

2021-09-11 09:25:05 字數 1025 閱讀 5863

given a collection of distinct integers, return all possible permutations.

example:

input: [1,2,3]

output:

[[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]字典序解法的答案是按照大小順序進行排列的。

在每次迴圈中,我們將上乙個找到的排列叫做m,我們只需要找到比m大且比其它比m大的排列小的那個排列即可(就是比m大的最小的那個)。

找到下乙個排列的演算法我用乙個例子來表示:

【例】 如何得到346987521的下乙個

1,從尾部往前找第乙個p(i-1) < p(i)的位置

4 6 <- 9 <- 8 <- 7 <- 5 <- 2 <- 1

最終找到6是第乙個變小的數字,記錄下6的位置i-1

2,從i位置往後找到最後乙個大於6的數

4 6 -> 9 -> 8 -> 7 5 2 1

最終找到7的位置,記錄位置為m

3,交換位置i-1和m的值

4 7 9 8 6 5 2 1

4,倒序i位置後的所有資料

4 7 1 2 5 6 8 9

則347125689為346987521的下乙個排列

對應下面的**,fromindex => i, endindex = 9, changeindex => m。

詳細可看字典序全排列演算法研究。

public list

>

permute

(int

nums)

int fromindex, endindex = nums.length -

1, changeindex;do}

while

(true);

return res;

}

leetcode 46 全排列(回溯)

給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 核心的遞迴部分如下 for begin in range 0 n for i in range begin,n swap nums begin n...

LeetCode 46 全排列(回溯)

給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 類似題目 leetcode 996.正方形陣列的數目 回溯 剪枝 class solution void bt vector int nums,i...

演算法 leetcode46全排列

leetcode 全排列 給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。示例 輸入 1 2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 這道題我們需要使用回溯的方法來進行求解。那我們回溯法的解體框架是什麼呢,解決乙個回溯問題,實際上就是乙個決策樹的遍歷...