[leetcode-60]Permutation Sequence(C)

来源:互联网 发布:知乎怎么做微信销售 编辑:程序博客网 时间:2024/06/05 19:00

问题描述:
The set [1,2,3,…,n] contains a total of n! unique permutations.

By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):

“123”
“132”
“213”
“231”
“312”
“321”
Given n and k, return the kth permutation sequence.

Note: Given n will be between 1 and 9 inclusive.

分析:看到这道题,我突然想到了之前做的leetcode中next permutation的那题,结果我直接复制进来,然后居然ac了,只是耗时太长了(192ms)。既然选择出满足条件的耗时太长,那么只能是构造出满足条件的数据了。

代码如下:192ms

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;0    }    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);}char* getPermutation(int n, int k) {    int *nums = (int *)malloc(sizeof(int)*n);    char *res = (char *)malloc(n+1);    int i;    for(i = 0;i<n;i++){        nums[i] = i+1;    }    for(i = 1;i<k;i++){        nextPermutation(nums,n);    }    res[n] = '\0';    for(i = 0;i<n;i++)        res[i] = nums[i]+'0';    return res;}
0 0