火星人(全排列)

火星人

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

相关推荐

不愿透露姓名的神秘牛友
昨天 12:19
点赞 评论 收藏
分享
专心打鱼:互联网搬运工,贴子都要偷
点赞 评论 收藏
分享
拒绝无效加班的小师弟很中意你:求职意向没有,年龄、课程冗余信息可以删掉,需要提升项目经历。排版需要修改。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务