031 - Next Permutation
2015-11-11 18:43
375 查看
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
int mycompar(const void *a, const void *b)
{
int *x = (int *)a;
int *y = (int *)b;
if (*x > *y) return 1;
return *x == *y? 0 : -1;
}
void nextPermutation(int* nums, int numsSize)
{
int *past = nums, i;
for (i = 1; i < numsSize; i++) {
if (nums[i] > nums[i - 1]) past = nums + i;
}
if (past == nums) {
qsort(nums, numsSize, sizeof(int), mycompar);
return;
}
int *left = past - 1;
int *right = past;
for (;past - nums < numsSize;past++)
if (*past < *right && *past > *left) right = past;
int tmp = *left;
*left = *right;
*right = tmp;
qsort(left + 1, numsSize - (left + 1 - nums), sizeof(int), mycompar);
}
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3→
1,3,2
3,2,1→
1,2,3
1,1,5→
1,5,1
意思就是找出全排序的下一个数
比如1 2 3的全排序是
123
132
213
231
312
321
如果当前值是全排序中最大的,那么就返回最小的
int mycompar(const void *a, const void *b)
{
int *x = (int *)a;
int *y = (int *)b;
if (*x > *y) return 1;
return *x == *y? 0 : -1;
}
void nextPermutation(int* nums, int numsSize)
{
int *past = nums, i;
for (i = 1; i < numsSize; i++) {
if (nums[i] > nums[i - 1]) past = nums + i;
}
if (past == nums) {
qsort(nums, numsSize, sizeof(int), mycompar);
return;
}
int *left = past - 1;
int *right = past;
for (;past - nums < numsSize;past++)
if (*past < *right && *past > *left) right = past;
int tmp = *left;
*left = *right;
*right = tmp;
qsort(left + 1, numsSize - (left + 1 - nums), sizeof(int), mycompar);
}
相关文章推荐
- Builder模式
- CURL_SETOPT()函数
- 实验二、作业调度实验
- 不懂技术的人请不要对懂技术的人说这很容易
- hiho刷题日记——第十天后序遍历
- linux java so 历险
- linux 命令
- linux防止ssh远程暴力破解的方法和fail2ban软件的配置应用
- c++set和multiset容器
- 机器学习复习——各类算法优缺点总结
- 监听Notification被清除
- 容器
- 【转】IOS --- OC与Swift混编
- cocos2dx android 5.0系统崩溃问题
- 第12回 小曹Notification也不能会用吧
- servlet
- java--容器---ArrayList的删除
- 新建Linux虚拟机初始化网络等设置
- 030 - Substring with Concatenation of All Words
- Linux进程间通信(IPC)编程实践(四) 详解System V消息队列(2)(msgsnd & msgrcv)