LeetCode 全排列II(回溯法)

2021-09-10 16:00:40 字數 1321 閱讀 4472

給定乙個可包含重複數字的序列,返回所有不重複的全排列。

示例:

輸入: [1,1,2]

輸出:[

[1,1,2],

[1,2,1],

[2,1,1]

]

思路分析:請先參考 leetcode 全排列 的解法。

第一種方法:利用set容器中「元素的唯一性」進行去重。

第二種方法:修改為set容器

class

solution

void

dfs(vector<

int>

& nums,

int begin, set

int>

>

& res)

return;}

};

第三種方法:將第一種方法的set改回vector,利用剪枝演算法進行去重!

剪枝演算法

vector> permuteunique(vector& nums)函式中的

sort(numbers.begin(), numbers.end());//首先進行排序,方便剪枝(跳過值相同的元素)

void permutedfs(vector&tempres, int steps)函式中的for迴圈

int tempvalue = numbers[index];//剪枝演算法,如果這個值使用過,在for中就要跳過它

while (index < numberssize && tempvalue == numbers[index])

遞迴演算法+剪枝,簡直是如虎添翼!!!大讚!

leetcode 47 全排列 II 回溯

全排列的題首先可以想到用回溯解決。在本題中,需要考慮的有兩點 如何判斷構建的排列陣列是否存在重複,以及如何避免使用重複的元素。避免重複比較簡單,可以構建乙個與nums等長的陣列,用於記錄哪個元素被使用過,這樣在往下遍歷時可以用該陣列進行判斷並避免重複使用。去重則比較麻煩,可以考慮使用jdk自帶的se...

LeetCode 全排列 回溯

傳送門 給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 參考官方題解 時間複雜度是 o k 1n p n,k o sum p n,k o k 1 n p n,k p n k n n k n n ...

LeetCode 回溯 全排列

給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 使用回溯來做。回溯也是在模擬人做排列的方法。例如做 1,2,3 的排列 第一步有3個數 1,2,3 可以選,先選1,此時結果為 1 接下來還有...