题目
https://leetcode-cn.com/problems/next-permutation/
分析
代码
class Solution {
public void nextPermutation(int[] nums) {
if(nums.length==1)
return;
int a=nums.length-2;
while(a>=0&&nums[a]>=nums[a+1]) {
a--;
}
if(a>=0){
int j=nums.length-1;
while(j>=0&&nums[j]<=nums[a]){
j--;
}
swap(nums,a,j);
}
reverse(nums,a+1);//反转[a+1,nums.length)
}
public void swap(int[] nums,int i,int j){
int tmp=nums[i];
nums[i]=nums[j];
nums[j]=tmp;
}
public void reverse(int[] nums,int start){
int left=start;
int right=nums.length-1;
while(left<right){
swap(nums,left,right);
left++;
right--;
}
}
}
复杂度
时间复杂度:O(N),其中 N 为给定序列的长度。我们至多只需要扫描两次序列,以及进行一次反转操作。
空间复杂度:O(1),只需要常数的空间存放若干变量。