配列の実装
1136 ワード
[順番は?]
与えられた順序の任意の集合を異なる順序で混合する演算.
たとえば、[1,2,3]の数列がある場合、対応する順序は6種類あります.
この場合、これは、昇順に配列された数列に対して、降順に変換する過程で、次の数列の過程を意味する.
s{i|0<=i1.s(数列)について、s[i-1]2.1番で見つかったi-1について、s[i-1]3.s[i-1]s[j]を置き換えます.
4.s[i.n-1]を反転させます.
例)s=[1,4,3,2]
1) i=1, s[i]=4, s[i-1]=1
2) j=3, s[j]=2
3)s[i-1]=1とs[j]=2を交換すると、s=[2,4,3,1]となる.
4)[i~n-1]=>[1~3]をs=[2,1,3,4]に反転する.
[実装]
与えられた順序の任意の集合を異なる順序で混合する演算.
たとえば、[1,2,3]の数列がある場合、対応する順序は6種類あります.
**[1,2,3]
[1,3,2]
[2,1,3]
[2,3,1]
[3,1,2]
[3,2,1]**
[next置換アルゴリズム]この場合、これは、昇順に配列された数列に対して、降順に変換する過程で、次の数列の過程を意味する.
s{i|0<=i
4.s[i.n-1]を反転させます.
例)s=[1,4,3,2]
1) i=1, s[i]=4, s[i-1]=1
2) j=3, s[j]=2
3)s[i-1]=1とs[j]=2を交換すると、s=[2,4,3,1]となる.
4)[i~n-1]=>[1~3]をs=[2,1,3,4]に反転する.
[実装]
void reverse(string &s,int i,int n){
for(;i<n;) swap(s[i++],s[n--]);
}
bool nextPermutation(string& s)
{
// 1. s(수열)에 대해서 s[i-1]<s[i]를 만족하는 가장 큰수를 찾는다.
// 2. 1번에서 찾은 i-1에 대하여 s[i-1]<s[j]를 만족하는 가장 큰 j를 찾는다
// 3. s[i-1] s[j]를 바꿔치기한다.
// 4. s[i..n-1]를 reverse시킨다.
int i, j;
i = j = s.size()-1;
while (s[i - 1] >= s[i]) if (--i== 0) return false; //1번에 해당하는 i찾기
while(s[j]<=s[i-1]) if(--j==0) return false; //2번에 해당하는 j찾기
swap(s[j],s[i-1]);
reverse(s,i,s.size()-1);
return true;
}
Reference
この問題について(配列の実装), 我々は、より多くの情報をここで見つけました https://velog.io/@geunwoobaek/permutation순열-구현テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol