火星人(全排列)
火星人
https://ac.nowcoder.com/acm/problem/16661
给你一个排列,输出下一次排列
思路:
下一个全排列也就是大于目前的数的集合中,最小的那一个组合
例:
输入:1 2 3 4 5
5
输出:1 2 3 5 4
void swap(int a[], int &i, int &j) { a[i] = a[i] ^ a[j]; a[j] = a[i] ^ a[j]; a[i] = a[i] ^ a[j]; } void all_sort(int a[], int n) { int max; // max 表示从右到左第一个局部最大值 for(int i = n - 1; i > 0; --i) { if(a[i] > a[i - 1]) { max = i; break; } } int x1 = max - 1; // x1 表示要交换的其中一个位置 int x2 = max; // x2 表示要交换的另一个位置 for(int i = x2; i < n; i++) { // x2 的位置上的数要是所有大于 x1 位置上的数中的最小的那个 if(a[i] > a[x1] && a[i] < a[x2]) x2 = i; } swap(a, x1, x2); //交换这两个位置的数 sort(a + max, a + n); //将 x1 后面的数按从小到大排列,保证是最小的 }