Permutations II解法代码的解释

来源:互联网 发布:测光表测出的数据调整 编辑:程序博客网 时间:2024/05/31 18:57

47.Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,[1,1,2] 

have the following unique permutations:

[  

[1,1,2],  

[1,2,1],  

[2,1,1]

]

Solution:

class Solution {public:    void recursion(vector<int> num, int i, int j, vector<vector<int> > &res) {        if (i == j-1) {            res.push_back(num);            return;        }        for (int k = i; k < j; k++) {            if (i != k && num[i] == num[k]) continue;            swap(num[i], num[k]);            recursion(num, i+1, j, res);        }    }    vector<vector<int> > permuteUnique(vector<int> &num) {        sort(num.begin(), num.end());        vector<vector<int> >res;        recursion(num, 0, num.size(), res);        return res;    }};
按照回溯法来做的话,为啥不swap回去呢?

找了很多博客也没看到对这代码有什么解释……

首先,要用回溯法也是可以的,但这份代码中并没有对每一个访问过的子节点进行标注已访问

而且,标注了后由于题目是不允许重复的,比如112中有2个相同的1会导致重复,最后还得放到一个set容器中,其实还多用了set容器的特性。并不好。


这里的解法是怎么解释呢?

为什么swap之后不swap回去了?

举个例子:“1122”(已经排了序)

我们会先访问到下标0的位置,为1,然后先访问本身,进入深度搜索,此时表示开始搜以1开头的数(1xxx)

下一个下标1的值为1,与1相同,交换了也还是一样,所以跳过。

再下一个为2,交换后,变成2112,然后i=1,继续搜,此时,注意!开始搜(2xxx)的数,下标0的数也变为了2。

以后再遇到下标k的值为2的数,我们就不交换了。为什么呢?


因为2112后,再换过也还是2112,会重复。

还是画个图吧……


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鼎城2008跳闸了怎么办 在河道打井塌方怎么办 手机黑漆掉了怎么办 周大生戒指坏了怎么办 上海宜家会员卡怎么办 电话被不停骚扰怎么办 雅高会员号忘记怎么办 米粉卡身份验证失效怎么办? 供应商给购物卡怎么办 挪用公司的钱怎么办 舞东风积分卡怎么办 电信不注销欠费怎么办 养老宝忘记密码怎么办 学生信用卡0额度怎么办 微信商户号怎么办 企业Uk证书过期怎么办 加挂账号不知道怎么办 钱打到对公账户怎么办 新中付没有到账怎么办 qq把钱转错了怎么办 转账输错号码怎么办 给别人转错钱了怎么办 转账到信用卡了怎么办 银行卡限额怎么办京东 预留信息忘了怎么办 中信银行香港卡怎么办 无银行预留信息怎么办 农工商超市红利卡怎么办 余额宝转入不了怎么办 公司车辆怎么办营运证 便利店转不出去怎么办 便利店开业营业额低怎么办 现在etc超时了怎么办? 中国银行e贷逾期怎么办 招商银行e分期逾期怎么办 保单贷款还不了怎么办 离婚时按揭房怎么办 按揭房子不要了怎么办? 征信有问题怎么办房贷 夫妻一方不做房贷共还人怎么办 给你花逾期一年怎么办