diff --git "a/1019\345\210\230\345\255\220\350\275\266/1019\344\273\243\347\240\201\345\235\227.md" "b/1019\345\210\230\345\255\220\350\275\266/1019\344\273\243\347\240\201\345\235\227.md" new file mode 100644 index 0000000..b6d22ec --- /dev/null +++ "b/1019\345\210\230\345\255\220\350\275\266/1019\344\273\243\347\240\201\345\235\227.md" @@ -0,0 +1,54 @@ +```yaml + +#include +#include +using namespace std; + +int countTrans(vector &p) +{ + int n = p.size(); + vector visited(n, false); + int transpositions = 0; + + for (int i = 0; i < n; i++) + { + +// 如果已经访问过或已经在正确的位置,跳过它 + if (visited[i] || p[i] == i + 1) + { + continue; + } + + int cycleLength = 0; + int current = i; + +// 持续循环,直到返回到起始元素 + while (!visited[current]) + { + visited[current] = true; + + //移动到循环中的下一个元素 + current = p[current] - 1; + cycleLength++; + } + + // 如果循环长度大于 1,添加cycleLength - 1 个换位 + if (cycleLength > 1) + { + transpositions += (cycleLength - 1); + } + } + + return transpositions; +} + +int main() +{ + vector p = {5, 1, 4, 3, 2}; + + int result = countTrans(p); + cout << result << endl; + + return 0; +} +```yaml diff --git "a/1019\345\210\230\345\255\220\350\275\266/1019\346\265\213\350\257\225\351\242\230.md" "b/1019\345\210\230\345\255\220\350\275\266/1019\346\265\213\350\257\225\351\242\230.md" new file mode 100644 index 0000000..f0d202d --- /dev/null +++ "b/1019\345\210\230\345\255\220\350\275\266/1019\346\265\213\350\257\225\351\242\230.md" @@ -0,0 +1,20 @@ +转置环是一种简洁的表示排列的方式,它将排列分解成多个循环。一个循环表示一组相互置换(或交换)的元素。 + +例子: + +考虑 [1, 2, 3, 4, 5] 的排列 p = [5, 1, 4, 2, 3],元素移动如下:1 → 5, 5 → 3, 3 → 4, 4 → 2, 2 → 1。由于所有元素都相连,因此只有一个循环,因此循环符号为 (1, 5, 3, 4, 2) +考虑另一个排列 p = [5, 1, 4, 3, 2],该排列中有两个循环,1 → 5 → 2(循环:( 1 , 5, 2))和 3 → 4(循环:( 3 , 4 ))。循环符号:(1, 5, 2) (3, 4) + +转置是长度为 2 的循环(2 元素交换)。任何循环都可以分解为转置的组合。转置的次数表示将恒等置换 (1, 2, 3, ..., n) 变换为给定置换所需的最少 2 元素交换次数。 + +关键规则:一个循环中的换位次数 = 循环长度 - 1 + + + + +**一句话概括:** +数组p=[5, 1, 4, 2, 3],存在某个起点通过不断 x = p[x] 会回到起点,计算其中的转置次数 + + +进阶思考: +问题 :给定一个元素排列n,表示为一个整数数组 p = [p1, p2, p3, ..., pn],计算其中的转置次数。 \ No newline at end of file diff --git "a/1019\345\210\230\345\255\220\350\275\266/\346\265\213\350\257\225\345\256\236\344\276\213.md" "b/1019\345\210\230\345\255\220\350\275\266/\346\265\213\350\257\225\345\256\236\344\276\213.md" new file mode 100644 index 0000000..3f2d59e --- /dev/null +++ "b/1019\345\210\230\345\255\220\350\275\266/\346\265\213\350\257\225\345\256\236\344\276\213.md" @@ -0,0 +1,8 @@ +#输入: p = [5, 1, 4, 3, 2] +#输出: 3 +解释:对于排列 [ 5, 1, 4, 3, 2],循环符号为: + +(1, 5, 2):1 → 5 → 2(3 个元素,2 个转置)。 +(3, 4) : 3 → 4(2 个元素,1 个转置)。 +总换位次数为 3。 +