日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

47. 全排列 II(回溯算法)

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 47. 全排列 II(回溯算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定一個可包含重復數字的序列 nums ,按任意順序 返回所有不重復的全排列。

示例 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

這個題目是一個排列題目,排列題目和組合、子集等題目又不同,不理解可以先看一下這里有排列的一個基礎題目和一些對排列的解析

歸根結底,排列就是有兩點不同:

每層都是從0開始搜索而不是start
需要used數組記錄path里都放了哪些元素了(即樹枝去重)

這道題我列出來的目的也不僅僅是為了說明排列問題的這兩點,同時這道題還需要進行樹層去重,因為序列中會出現重復元素
再溫習一下樹層去重:
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) {//對每個數層進行去重,且對每個樹枝進行去重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;} };

總結

以上是生活随笔為你收集整理的47. 全排列 II(回溯算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。