火星人(全排列)

火星人

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 后面的数按从小到大排列,保证是最小的
}
全部评论

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务