46.Permutation

class Solution {
public:
    vector<vector<int> > permute(vector<int> &num) {
        vector<vector<int> > res;
        permuteDFS(num, 0, res);
        return res;
    }
    void permuteDFS(vector<int> &num, int start, vector<vector<int> > &res) {
        if (start >= num.size()) res.push_back(num);
        for (int i = start; i < num.size(); ++i) {
            swap(num[start], num[i]);
            //num[start]是固定的 然后num[i]往后移不断交换
            permuteDFS(num, start + 1, res);
            swap(num[start], num[i]);
        }
    }
};

对于第k层节点来说,就是交换固定了前面 k-1 位,然后分别 swap(k,k), swap(k, k+1) , swap(k, k+2) ...

例如上图中的第三层,固定了第一位(即2),然后分别交换第11位,12位,13

class Solution {
private:
    vector<vector<int>> res;
    vector<bool> used;

    // p中保存了一个有index-1个元素的排列。
    // 向这个排列的末尾添加第index个元素, 获得一个有index个元素的排列
    void generatePermutation( const vector<int>& nums, int index, vector<int>& p){

        if( index == nums.size() ){
            res.push_back(p);
            return;
        }

        for( int i = 0 ; i < nums.size() ; i ++ )
            if( !used[i] ){
                used[i] = true;
                p.push_back( nums[i] );
                generatePermutation(nums, index+1, p );
                p.pop_back();
                used[i] = false;
            }

        return;
    }
public:
    vector<vector<int>> permute(vector<int>& nums) {

        res.clear();
        if( nums.size() == 0 )
            return res;

        used = vector<bool>(nums.size(), false);
        vector<int> p;
        generatePermutation( nums, 0, p );

        return res;
    }
};
test
#include <iostream>
#include <vector>
using namespace std;
class Solution {  

    vector<vector<int> > ret;  
    int N;  

public:  
    void perm(vector<int> &num, int i){  
        if( i == N){  
            cout<<"Add:";
            for(auto i :num){
              cout<<i<<" ";   
            }
            cout<<endl;
            ret.push_back(num);  
        }  

        for(int j = i; j < N; j++){  
            //cout<<"Swap:"<<num[i]<<" "<<num[j]<<endl;;
            swap(num[i], num[j]);  
            perm(num, i + 1);  
           // cout<<"SwapBack:"<<num[i]<<" "<<num[j]<<endl;;
            swap(num[j], num[i]);  
        }  
    }  


    vector<vector<int> > permute(vector<int> &num) {  
        // Start typing your C/C++ solution below  
        // DO NOT write int main() function  
        N = num.size();  
        ret.clear();  

        perm(num, 0);  

        return ret;  

    }  
}; 

int main() {
    int nums[] = {1, 2, 3};
    vector<int> vec(nums, nums + sizeof(nums)/sizeof(int) );

    vector< vector<int> > res = Solution().permute(vec);
    for( int i = 0 ; i < res.size() ; i ++ ){

        for( int j = 0 ; j < res[i].size() ; j ++ )
            cout<<res[i][j]<<" ";
        cout<<endl;
    }
}
i=0,j=0
Swap:1 1
i=1,j=1
Swap:2 2
i=2,j=2
Swap:3 3
i=3
Add:1 2 3 
i=2,j=2
SwapBack:3 3
i=1,j=1
SwapBack:2 2
i=1,j=2
Swap:2 3

Swap:2 2
Add:1 3 2 
SwapBack:2 2
SwapBack:3 2
SwapBack:1 1
Swap:1 2
Swap:1 1
Swap:3 3
Add:2 1 3 
SwapBack:3 3
SwapBack:1 1
Swap:1 3
Swap:1 1
Add:2 3 1 
SwapBack:1 1
SwapBack:3 1
SwapBack:2 1
Swap:1 3
Swap:2 2
Swap:1 1
Add:3 2 1 
SwapBack:1 1
SwapBack:2 2
Swap:2 1
Swap:2 2
Add:3 1 2 
SwapBack:2 2
SwapBack:1 2
SwapBack:3 1
1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 2 1 
3 1 2

results matching ""

    No results matching ""