leetcode全配列


一、テーマ説明:
重複する数値のないシーケンスを指定し、可能なすべての配列を返します.
例:
  : [1,2,3]
  :
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

二、問題を解く構想:
2つの位置を絶えず交換する方法を用いて、ある点を開始点とし、順次と後続を交換するすべての配列が得られる.重複項目がないため、得られるシーケンスは異なる結果である.例えば、
1   2   3
/* 
 *         
 * 1 2   ->2    1   3 
 * 1 3   ->3    2   1
 */

2   1   3
/*
 *  2   1   3  
 *         
 * 1 3   ->2   3   1
 */

3   2   1
/*
 *  3   2   1  
 *         
 * 2 1   ->3   1   2
 */

/*    */
1   2   3
2   1   3
2   3   1
3   1   2
3   2   1

しかし、この方法は結果が少なく、{1 3 2}です.シーケンス{1 2 3}の場合は1を開始点としたが,2と3を交換しなかったためである.解決策は,開始点で交換を行う場合も,一度自分と交換しなければならないが,交換の結果を結果に追加することはできない.しかし、第1シーケンス{1 2 3}については結果に含まれないので、交換前に第1シーケンスを手動で追加する必要がある. 
三、C++コード:
class Solution {
public:
    vector> permute(vector& nums) {
        vector> res;
        /*         */
        res.push_back(nums);
        get_permutation(nums, 0, res);
        return res;
    }
private:
    void get_permutation(vector& nums, int idx, vector>& res)
    {
        if(idx >= nums.size())
            return;
        /*  idx       ,         */
        for(int i = idx; i < nums.size(); ++i)
        {
            /*   ,       */
            swap(nums[i], nums[idx]);
            /*            ,           */
            if(i != idx)
                res.push_back(nums);
            /*     ,            */
            get_permutation(nums, idx + 1, res);
            /*        ,       ,         */
            swap(nums[i], nums[idx]);
        }
    }
};

----------------------著者:プログラムスラグの小裏庭の出所:CSDN原文:https://blog.csdn.net/sinat_35261315/article/details/78406927本文は博主のオリジナルの文章で、転載して博文のリンクを添付してください!