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).ide
The replacement must be in-place, do not allocate extra memory.spa
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
3d
题目简要:题目涉及到的是全排列问题,全排列的方法有不少,每种全排列的方法获得的排列顺序不一样,可是对于一种全排列顺序而言,下一个排列指的是咱们所用的排列方法获得一个排列顺序,指定一个排列,它在获得的排列顺序中的下一个排列是什么?本题目是按字典法进行的。code
如1,2,3进行全排列为:blog
1,2,3排序
1,3,2it
2,1,3io
2,3,1event
3,1,2
3,2,1
这样咱们指定一个排列为1,2,3,那么它的下一个排列就是1,3,2.
具体作法:以5,4,7,5,3,2为例,
5,4,7,5,3,2是一个排列,而且咱们知道一个排列是有规律的,一个排列是有规律的,一个排列能够分为两个部分(其中一个部分能够为空),其中部分必定是递减顺序的,而另外一个也是递减顺序的。5,4是递减的,7,5,4,3是递增的。
要想获得下一个排列,首先咱们必须知道将要变更的值是那个。全排的最后一个序列必定是递减顺序的,因此排列两部分中递减顺序的哪部分必定不须要改变,因此咱们首先要找到id一个非递减顺序的值,也就是4位置为1,而后找到要和4交换的值,这个值是要在4以后的那个值中查找,要求是大于4的最小的那个,又由于咱们是从右向作的查找,因此第一个大于4的便可。交换位置后,对位置1后面的序列进行排序。排序的缘由是由字典排序的特性,如1,2,3时,当第一值变为2的时候为2,1,3, 2 后面的序列必定是从小到大的排序的,因此当咱们交换两个值后要进行排序。又由于这个算法不看排序方法的时候时间复杂度为O(n),因此这个算法的时间复杂度取决于你的排序算法的时间复杂度。
void Sort(int* arr,int low ,int high) { if(low>=high)return ; int val=arr[low]; int i=low; int j=high; while(i<j){ while(i<j&&arr[j]>val)j--; arr[i]=arr[j]; while(i<j&&arr[i]<=val)i++; arr[j]=arr[i]; } arr[i]=val; Sort(arr,low,i-1); Sort(arr,i+1,high); } void nextPermutation(int* nums, int numsSize) { if(numsSize<=1)return ; int i=numsSize-1; while(i>0) { if(nums[i]>nums[i-1])break; i--; } printf("%d\n",nums[i-1]); if(i<=0)Sort(nums,0,numsSize-1); else{ for(int j=numsSize-1;j>=i;j--) if(nums[i-1]<nums[j]){ nums[i-1]+=nums[j]; nums[j]=nums[i-1]-nums[j]; nums[i-1]-=nums[j]; Sort(nums,i,numsSize-1); break ; } } }