leetcode全配列
一、テーマ説明:
重複する数値のないシーケンスを指定し、可能なすべての配列を返します.
例:
二、問題を解く構想:
2つの位置を絶えず交換する方法を用いて、ある点を開始点とし、順次と後続を交換するすべての配列が得られる.重複項目がないため、得られるシーケンスは異なる結果である.例えば、
しかし、この方法は結果が少なく、
三、C++コード:
----------------------著者:プログラムスラグの小裏庭の出所:CSDN原文:https://blog.csdn.net/sinat_35261315/article/details/78406927本文は博主のオリジナルの文章で、転載して博文のリンクを添付してください!
重複する数値のないシーケンスを指定し、可能なすべての配列を返します.
例:
: [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本文は博主のオリジナルの文章で、転載して博文のリンクを添付してください!