From f90e63ffb0da534d33b57051fab2cd1658115b70 Mon Sep 17 00:00:00 2001 From: jingdu-nn <1329324279@qq.com> Date: Sun, 19 Oct 2025 20:42:08 +0800 Subject: [PATCH 1/2] Add files via upload --- ...19\344\273\243\347\240\201\345\235\227.md" | 54 +++++++++++++++++++ ...19\346\265\213\350\257\225\351\242\230.md" | 20 +++++++ ...13\350\257\225\345\256\236\344\276\213.md" | 8 +++ 3 files changed, 82 insertions(+) create mode 100644 "1019/1019\344\273\243\347\240\201\345\235\227.md" create mode 100644 "1019/1019\346\265\213\350\257\225\351\242\230.md" create mode 100644 "1019/\346\265\213\350\257\225\345\256\236\344\276\213.md" diff --git "a/1019/1019\344\273\243\347\240\201\345\235\227.md" "b/1019/1019\344\273\243\347\240\201\345\235\227.md" new file mode 100644 index 0000000..3bbf401 --- /dev/null +++ "b/1019/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/1019\346\265\213\350\257\225\351\242\230.md" "b/1019/1019\346\265\213\350\257\225\351\242\230.md" new file mode 100644 index 0000000..4833fbd --- /dev/null +++ "b/1019/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/\346\265\213\350\257\225\345\256\236\344\276\213.md" "b/1019/\346\265\213\350\257\225\345\256\236\344\276\213.md" new file mode 100644 index 0000000..be8f931 --- /dev/null +++ "b/1019/\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。 + From 0738fc55ddc2ebec1f2c4fe6dab3a789b7e6adb2 Mon Sep 17 00:00:00 2001 From: unknown <1329324279@qq.com> Date: Sun, 19 Oct 2025 20:58:57 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=AF=B4=E6=98=8E=EF=BC=9A=E9=87=8D?= =?UTF-8?q?=E5=91=BD=E5=90=8D/=E6=B7=BB=E5=8A=A0=201019=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B9=20&=20=E5=A2=9E=E5=8A=A0=E7=BB=83=E4=B9=A0?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...19\344\273\243\347\240\201\345\235\227.md" | 108 +++++++++--------- ...19\346\265\213\350\257\225\351\242\230.md" | 38 +++--- ...13\350\257\225\345\256\236\344\276\213.md" | 16 +-- 3 files changed, 81 insertions(+), 81 deletions(-) rename "1019/1019\344\273\243\347\240\201\345\235\227.md" => "1019\345\210\230\345\255\220\350\275\266/1019\344\273\243\347\240\201\345\235\227.md" (95%) rename "1019/1019\346\265\213\350\257\225\351\242\230.md" => "1019\345\210\230\345\255\220\350\275\266/1019\346\265\213\350\257\225\351\242\230.md" (98%) rename "1019/\346\265\213\350\257\225\345\256\236\344\276\213.md" => "1019\345\210\230\345\255\220\350\275\266/\346\265\213\350\257\225\345\256\236\344\276\213.md" (96%) diff --git "a/1019/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" similarity index 95% rename from "1019/1019\344\273\243\347\240\201\345\235\227.md" rename to "1019\345\210\230\345\255\220\350\275\266/1019\344\273\243\347\240\201\345\235\227.md" index 3bbf401..b6d22ec 100644 --- "a/1019/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" @@ -1,54 +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 +```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/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" similarity index 98% rename from "1019/1019\346\265\213\350\257\225\351\242\230.md" rename to "1019\345\210\230\345\255\220\350\275\266/1019\346\265\213\350\257\225\351\242\230.md" index 4833fbd..f0d202d 100644 --- "a/1019/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" @@ -1,20 +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] 会回到起点,计算其中的转置次数 - - -进阶思考: +转置环是一种简洁的表示排列的方式,它将排列分解成多个循环。一个循环表示一组相互置换(或交换)的元素。 + +例子: + +考虑 [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/\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" similarity index 96% rename from "1019/\346\265\213\350\257\225\345\256\236\344\276\213.md" rename to "1019\345\210\230\345\255\220\350\275\266/\346\265\213\350\257\225\345\256\236\344\276\213.md" index be8f931..3f2d59e 100644 --- "a/1019/\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" @@ -1,8 +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。 - +#输入: 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。 +