47. 全排列 II(回溯算法)
生活随笔
收集整理的這篇文章主要介紹了
47. 全排列 II(回溯算法)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
給定一個可包含重復(fù)數(shù)字的序列 nums ,按任意順序 返回所有不重復(fù)的全排列。
示例 1:
輸入:nums = [1,1,2]
輸出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
輸入:nums = [1,2,3]
輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
這個題目是一個排列題目,排列題目和組合、子集等題目又不同,不理解可以先看一下這里有排列的一個基礎(chǔ)題目和一些對排列的解析
歸根結(jié)底,排列就是有兩點不同:
每層都是從0開始搜索而不是start
需要used數(shù)組記錄path里都放了哪些元素了(即樹枝去重)
這道題我列出來的目的也不僅僅是為了說明排列問題的這兩點,同時這道題還需要進行樹層去重,因為序列中會出現(xiàn)重復(fù)元素,
再溫習(xí)一下樹層去重:
1,先對原集合排序
2,同一層的前一個樹枝元素為false去重
代碼如下:
class Solution { public:vector<vector<int>> ans;vector<int> path;void backTacking(vector<int>& nums, vector<bool>& used) {if (path.size() == nums.size()) {ans.push_back(path);return ;}for (int i = 0; i < nums.size(); ++i) {//對每個數(shù)層進行去重,且對每個樹枝進行去重if ((i > 0 && nums[i - 1] == nums[i] && !used[i - 1]) || used[i]) {continue;}used[i] = true;path.push_back(nums[i]);backTacking(nums, used);path.pop_back();used[i] = false;}}vector<vector<int>> permuteUnique(vector<int>& nums) {vector<bool> used(nums.size(), false);sort(nums.begin(), nums.end());backTacking(nums, used);return ans;} };總結(jié)
以上是生活随笔為你收集整理的47. 全排列 II(回溯算法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 491. 递增子序列(回溯算法)
- 下一篇: 332. 重新安排行程(回溯算法)