[leetcode-31]Next Permutation(C)

来源:互联网 发布:静态路由协议端口号 编辑:程序博客网 时间:2024/05/16 18:03

问题描述:
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.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

分析:这道题有必要说说题意。假设有5个数:1,2,3,4,5,那么会有一个全排列。12345,12354,12435,12453,,,,,,共5!种从小到大的排列。那么12345的下一个数就是12354。依次类推,我们知道最后一个数:54321,那它的下一个数就是12345了。
题意明白了,算法也是有现成的。

  1. 从右向左查找出现满足条件的第一个元素j。该元素大于右边的元素
  2. 如果找不到,直接反转整个数组
  3. 然后在j的右边,找到大于nums[j]的最小元素i,且尽量向右延伸
  4. 交换nums[i]和nums[j]
  5. 对j右边的元素进行反转。

代码如下:4ms

void reverse(int *nums,int start,int end){    int left = start;    int right = end-1;    int tmp;    while(left<right){        tmp = nums[left];        nums[left] = nums[right];        nums[right] = tmp;        left++;        right--;    }}void nextPermutation(int* nums, int numsSize) {    if(numsSize<2)        return;    int i,j;    for(i = numsSize-2;i>=0;i--){        if(nums[i]<nums[i+1])            break;    }    if(i<0){        reverse(nums,0,numsSize);        return;    }    int min = nums[i+1];    int index = i+1;    for(j = i+2;j<numsSize;j++){        if(nums[j]>nums[i]&&nums[j]<=min){            min = nums[j];            index = j;        }    }    nums[index] = nums[i];    nums[i] = min;    reverse(nums,i+1,numsSize);}
0 0
原创粉丝点击