下一个排列实现
来源:互联网 发布:php前台模板 编辑:程序博客网 时间:2024/05/01 14:28
#include <iostream>using namespace std;//交换数组里面的两个元素void swap(int array[], int i, int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;}//反转数组区间void reverse(int array[], int first, int last) //左闭右开区间,与STL保持一致,[first, last){ last--;while (first < last)swap(array, first++, last--);}/*** @brief 返回下一个排列,例如当前排列是12345,下一个是12354* @param[inout] num 当前排列,例如12345* @param[in] first 开始位置* @param[in] last 结束位置,左闭右开区间* @return 成功返回0,失败返回-1*/int next_permutation(int num[], int first, int last) {int i, j;i = last - 2; while (i >= 0 && num[i] >= num[i + 1])//步骤1:从右往左找,找到第一个违反升序的数字(记作:划分数字),用i保存位置i--;if (i == -1) //没找到,说明整个序列是降序的{reverse(num, first, last);//回到第一个位置,即升序return -1;}j = last - 1; while (num[j] <= num[i])//步骤2:从右往左找,找到第一个大于划分数字的数字,记作改变数字,用j保存位置--j;swap(num, i, j);//步骤3:交换划分数字和改变数字的位置reverse(num, i + 1, last);//步骤4:把划分数字位置右边的所有数字逆序return 0;}void printArray(int array[], int len){for (int i = 0; i < len; i++){cout << array[i] << " " ;}cout << endl;}int main(){int a[] = {1,2,3,4};printf("original permutation:\t");printArray(a, 4);next_permutation(a, 0, 4);printf("next permutation:\t");printArray(a, 4);return 0;}
0 0
- 下一个排列实现
- 下一个排列
- 下一个排列
- 下一个排列
- 下一个排列
- 下一个排列
- 下一个排列
- 下一个排列
- 下一个排列
- 字典序全排列输出下一个的java实现
- LinkCode 下一个排列、上一个排列
- POJ 1146 下一个排列
- 下一个排列(Next Permutation)
- Next Permutation 下一个排列
- 寻找下一个最大排列
- uva 146(下一个排列)
- 7.2.4 下一个排列
- LintCode-下一个排列
- 请保持正常的心思
- 【机房重构】知识点积累
- socket通信之——同步选择机制select()与异步选择机制WSAASyncSelect()的探讨
- IOS开发多线程—08GCD的常见用法
- 黑马程序员_匿名内部类
- 下一个排列实现
- iOS开发多线程—09NSOperation简单介绍
- Spring MVC工作流程图
- LeetCode --- Combination Sum
- C++ string 详解
- 复制-17.1
- 回憶 那時年少(二)
- CentOS中安装JDK与Intellij idea
- iOS开发多线程—10NSOperation基本操作