题解 | #没有重复项数字的全排列#

没有重复项数字的全排列

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.比如,在官方解法中的那个图解,从第二层递归到了第三层,但是只遍历了最左子树,右面两个没有,欸也没有设置变量记录递归前的结果,所以利用回溯,可以还原递归前结果,进行右边子树的递归)

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-26 15:46
已编辑
字节国际 电商后端 24k-35k
点赞 评论 收藏
分享
10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
评论
3
收藏
分享
牛客网
牛客企业服务