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:
按照回溯法来做的话,为啥不swap回去呢?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; }};
找了很多博客也没看到对这代码有什么解释……
首先,要用回溯法也是可以的,但这份代码中并没有对每一个访问过的子节点进行标注已访问
而且,标注了后由于题目是不允许重复的,比如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,会重复。
还是画个图吧……
阅读全文
0 0
- Permutations II解法代码的解释
- Leetcode Permutations II 最简单的解法
- Permutations II问题及解法
- ***[Lintcode]Permutations II 带重复元素的排列 递归/非递归解法
- 【LeetCode】Permutations && Permutations II
- leetcode: Permutations/Permutations II
- leetcode Permutations & Permutations II
- [Leetcode]Permutations && Permutations II
- Permutations and Permutations II
- Permutations && Permutations ii
- Permutations II
- Permutations II
- Permutations II
- Permutations II
- Permutations II
- Permutations II
- Permutations II
- Permutations II
- 环信透传消息
- sql,select拼接||,小数,前面的0不见了
- C语言基本数据类型
- mongodb知识总结
- 《机器学习》基本术语标准翻译总结:第1章
- Permutations II解法代码的解释
- UGUI动态生成列表功能实现(增删保存)
- 动态视图中的获取数据
- 图片放大缩小,滚动鼠标
- python--生成器:yield的表达式形式,send
- win10在mac高清屏下应用显示字体小的解决方案
- 教你如何迅速秒杀掉:99%的海量数据处理面试题
- swoole常用配置设置(新手得细看,里边不少的注释是自己加上的)
- Edittext设置身份证输入格式