C代码
int comp(const void *a, const void *b) {
return *((int *)a) - *((int *)b);
}
void swap(int *nums, int a, int b) {
nums[a] ^= nums[b];
nums[b] ^= nums[a];
nums[a] ^= nums[b];
}
int find_idx(int *nums, int numsSize, int *s, int *e) {
int si, ei;
si = numsSize - 2;
ei = numsSize - 1;
while(1) {
if (si < 0 || ei < 1) {
break;
}
if (nums[si] >= nums[si+1]) {
si--;
continue;
}
if (nums[ei] <= nums[si]) {
ei--;
continue;
}
*s = si;
*e = ei;
swap(nums, si, ei);
qsort(&nums[si+1], numsSize-si-1, sizeof(int), comp);
return 0;
}
return -1;
}
void nextPermutation(int* nums, int numsSize){
int i,j;
int ret;
if (numsSize < 2) {
return;
}
ret = find_idx(nums, numsSize, &i, &j);
if (ret == -1) {
qsort(nums, numsSize, sizeof(int), comp);
}
}
注意点
- 注意如用例
[1,5,1]
,从后遍历ei的情况出现相等的值也需要跳过,即判断条件修改为nums[ei] <= nums[si]
; - 注意如用例
[2,2,7,5,4,3,2,2,1]
,搜索逆序对的时,遇到相等的值也需要跳过,即条件修改为nums[si] >= nums[si+1]
; - 注意当nums为最大时,即满足从大到小排列,此时
find_idx
返回-1
,所以给nums按从小到大排序可以满足题意;
题目
思想
1.尽量变化更小的操作;
2.全排列去掉不满足的;(未在文中实现)