深度优先搜索(DFS)---LeetCode47(全排列II)

4 篇文章 0 订阅
1 篇文章 0 订阅

此前,也写过一篇用dfs解决全排列问题的博客,今天又遇到一个变形,于是忍不住就撸了一把代码。

题目描述:

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

示例:

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

这跟之前的思路类似,还是以每一个数为根深度优先搜索其他的数,每条路径即是一条解法,但是也有差别,之前不重复的序列,现在是包含重复数字的序列,若要返回不重复的全排列这里需要做一些简单的修改。以上诉示例明--a[0] = 1, a[1] = 1, a[2] = 2,那么组成的排列按着之前的思路解法有以a[0]为根有:a[0]->a[1]->a[2]  a[0]->a[2]->a[1], 以a[1]为根有a[1]->a[0]->a[2],a[1]->a[2]->a[1]这里是不是以a[0,a[1]为根搜索出来的排列是重复的,因为a[0] == a[1],其他的数字不变,以他们为根刚刚好可以组成重复的两套排列,那么思路就有了:

      1) 把输入数列排序

      2)遍历各个数组为根的时候,如果有前一个数,且跟相等,且前一个数已经作为根搜索过,那么跳过这个数。

献上代码:

void DFS(int k, vector<int>&nums, vector<int>&pa, vector<vector<int>>&res, bool fa[])
{
    if (k == nums.size()) {
	res.push_back(pa);
	return;
    }
    for (int i = 0; i < nums.size(); i++) {
	if (i > 0 && nums[i] == nums[i-1] && fa[i-1] == true) {//修改的地方
            continue;
	}
	if (fa[i] == 0) {
	   pa.push_back(nums[i]);
	   fa[i] = 1;
	   DFS(k+1, nums, pa, res, fa);
	   fa[i] = 0;
	   pa.pop_back();
	}
    }
}
 
vector<vector<int>> permute(vector<int>& nums) 
{
    vector<vector<int>>a;
    vector<int>ans;
    bool flag[50];
    for (int i = 0; i < 50; i++) {
	flag[i] = false;
    }
    vector<int>num_temp;
    num_temp = nums;
    sort(num_temp.begin(), num_temp.end());
    DFS(0, num_temp, ans, a, flag);
    return a;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breakpoints_

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值