题解 | #没有重复项数字的全排列#
没有重复项数字的全排列
https://www.nowcoder.com/practice/4bcf3081067a4d028f95acee3ddcd2b1
这个解法是通过递归实现。不太简单(对我来说),hhh
最主要的是,他的自测的结果是错的,让我盯了好一会,我以为是我错了,,还让我认真的在看了好久的答案解法。。。
class Solution { public: void recursion(vector<vector<int>> &res , vector<int> &num , int index){ if(index == num.size() - 1) res.push_back(num); //@1 else{ for(int i = index; i < num.size(); i++){ //@2 swap(num[i], num[index]); //@3 recursion(res , num , index + 1); //@4 swap(num[i] , num[index]); //@5 } } } vector<vector<int> > permute(vector<int> &num) { sort(num.begin() , num.end()); vector<vector<int>> res; recursion(res , num , 0); return res; } };
按照自测【1,2,3】那个给的答案,明显不符和[3,2,1]时候的全排列顺序
主要说一下这几个重要的几步吧:
@1 第一步,这个是这个递归中,将当前递归中的排列压入二维vector中
@2 这个循环:主要是将index和剩下的每一个进行交换
@3 这一步是将index之后的每一个和index交换,从宏观图像上将,是官方解法树图像中的树的第二层。(当然,按照微观递归来讲,他是固定了第一个先不断递归到后面所有排列结束)
@4 这一步是不断递归,(其中index+1不断增加,说明会固定住index,递归出他之后的排列)
@5 利用递归回溯时将已经变换的排列恢复原样,重新向另一种情况进发(eg.比如,在官方解法中的那个图解,从第二层递归到了第三层,但是只遍历了最左子树,右面两个没有,欸也没有设置变量记录递归前的结果,所以利用回溯,可以还原递归前结果,进行右边子树的递归)