LeetCode-31-Next Permutation(C语言实现)
2018-01-02 02:03
295 查看
int cmp(const void *a, const void *b){
return *(int*)a - *(int*)b;
}
//返回nums数组中下标l到r之间(包含l和r)比flag大的最小的数的下标
//如果没有比flag大的数则返回-1
int min(int *nums, int l, int r, int flag){
int i, pos = -1;
for(i = l; i <= r; ++i){
if(nums[i] > flag){
pos = i;
goto step0;
}
}
step0:
for(i = pos + 1; i <= r; ++i){
if(nums[i] > flag && nums[i] < nums[pos]){
pos = i;
}
}
return pos;
}
//思路:从倒数第二位数开始依次查找该数nums[i]后面是否有大于它的数
//如果有,用min函数获得大于它的数中最小的数的下标pos,并交换nums[i]和nums[pos]
//再对第i位之后的数进行快排,即得到结果
void nextPermutation(int* nums, int numsSize) {
bool able = false;
int i, tmp, pos;
for(i = numsSize - 2; i >= 0; --i){
pos = min(nums, i + 1, numsSize - 1, nums[i]);
if(pos != -1){
tmp = nums[i];
nums[i] = nums[pos];
nums[pos] = tmp;
qsort(&nums[i + 1], numsSize - i - 1, sizeof(int), cmp);
able = true;
goto step;
}
}
step:
if(!able){
for(i = 0; i < numsSize / 2; ++i){
tmp = nums[i];
nums[i] = nums[numsSize - 1 - i];
nums[numsSize - 1 - i] = tmp;
}
}
}
return *(int*)a - *(int*)b;
}
//返回nums数组中下标l到r之间(包含l和r)比flag大的最小的数的下标
//如果没有比flag大的数则返回-1
int min(int *nums, int l, int r, int flag){
int i, pos = -1;
for(i = l; i <= r; ++i){
if(nums[i] > flag){
pos = i;
goto step0;
}
}
step0:
for(i = pos + 1; i <= r; ++i){
if(nums[i] > flag && nums[i] < nums[pos]){
pos = i;
}
}
return pos;
}
//思路:从倒数第二位数开始依次查找该数nums[i]后面是否有大于它的数
//如果有,用min函数获得大于它的数中最小的数的下标pos,并交换nums[i]和nums[pos]
//再对第i位之后的数进行快排,即得到结果
void nextPermutation(int* nums, int numsSize) {
bool able = false;
int i, tmp, pos;
for(i = numsSize - 2; i >= 0; --i){
pos = min(nums, i + 1, numsSize - 1, nums[i]);
if(pos != -1){
tmp = nums[i];
nums[i] = nums[pos];
nums[pos] = tmp;
qsort(&nums[i + 1], numsSize - i - 1, sizeof(int), cmp);
able = true;
goto step;
}
}
step:
if(!able){
for(i = 0; i < numsSize / 2; ++i){
tmp = nums[i];
nums[i] = nums[numsSize - 1 - i];
nums[numsSize - 1 - i] = tmp;
}
}
}
相关文章推荐
- LeetCode-6-ZigZag Conversion(C语言实现)
- LeetCode-3-Longest Substring Without Repeating Characters(C语言实现)
- Leetcode 31 Next Permutation (C++实现)
- LeetCode-14-Longest Common Prefix(C语言实现)
- [leetcode]Validate Binary Search Tree (判断有效二叉搜索树 C语言实现)
- [leetcode] Excel Sheet Column Title (excel表格的数字转字母表示格式) C语言实现
- LeetCode-747-Min Cost Climbing Stairs(C语言实现)
- LeetCode-19-Remove Nth Node From End of List(C语言实现)
- [leetcode](Gray Code 格雷码 C语言实现)
- [leetcode]31.Next Permutation(Java实现)
- [leetcode]Merge Sorted Array (两个有序数组的合并 C语言实现)
- LeetCode-21-Merge Two Sorted Lists(C语言实现)
- python实现 LeetCode31——Next Permutation
- leetcode Add Digits 之C语言实现
- LeetCode-4-Median of Two Sorted Arrays(C语言实现)
- LeetCode-748-Largest Number At Least Twice of Others(C语言实现)
- LeetCode-26-Remove Duplicates from Sorted Array(C语言实现)
- LeetCode-9-Palindrome Number(C语言实现)
- LeetCode-27-Remove Element(C语言实现)
- [leetcode]Length of Last Word (求最后一个单词的长度 C语言实现)