LeetCode 47 全排列II

本文介绍了一种解决含重复数字序列的全排列问题的算法。通过排序和特定条件跳过重复元素实现有效去重,避免生成重复的排列组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

解题思路:

与上一题相比,这题多了一个无重复条件。那即在上一题的基础上加上去重处理即可。

去重办法:

首先,为了判别存在重复的数字,我们可以让重复的数字紧靠在一起,这样就可以用 if(nums[i] == nums[i-1]) 这样的方法来判重。那怎么让重复的数字紧靠在一起呢? 使用sort从小到大排序。

然后,使用上述的判重语句,并且只保留一个循环。

注意:判重那行代码中 visited[i-1] == 0 的含义,为1时代表目前只有一个这样的排列,即第一个(1、1、2),我们只保留第一个。

代码:

 1 class Solution {
 2 public:
 3     vector<vector<int>> permuteUnique(vector<int>& nums) {
 4         vector<vector<int>> ans;
 5         vector<int> out;
 6         vector<int> visited(nums.size(), 0);
 7         sort(nums.begin(), nums.end());
 8         perDFS(nums,0,visited,out,ans);
 9         return ans;
10     }
11     void perDFS(vector<int> nums, int lever, vector<int> &visited, vector<int> &out, vector<vector<int>> &ans) {
12         if(lever == nums.size()){
13             ans.push_back(out);
14             return ;
15         }
16         for(int i=0; i<nums.size(); ++i){
17             if(visited[i])
18                 continue;
19             if(i>0 && nums[i] == nums[i-1] && visited[i-1]==0) continue; //判重
20             visited[i] = 1;  
21             out.push_back(nums[i]);
22             perDFS(nums,lever+1,visited,out,ans); 
23             out.pop_back();       
24             visited[i] = 0;
25         }
26     }
27 };

 

转载于:https://www.cnblogs.com/moxiangfeng/p/10674351.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值