以上方法中,最坏情况需要扫描数组三次,所以时间复杂度是O(3*n)=O(n),空间复杂度是O(1)。代码如下:
public void nextPermutation(int[] num) { int len=num.length; if(len<2){ return; } int p=-1; int i=0; for(i=len-1;i>0;i--){ if(num[i]>num[i-1]){ p=i-1; break; } } int k=len-1; if(p>=0){ for(i=p+1;i<len;i++){ if(num[p]>=num[i]){ k=i-1; break; } } swap(num,p,k); } reverse(num,p+1,len-1); } public void reverse(int[] num,int i,int j){ int l=num.length; int m=(i+j)/2; for(int k=i;k<=m;k++){ swap(num,k,l+i-k-1); } } public void swap(int[] num,int i,int j){ int temp = num[i]; num[i] = num[j]; num[j] = temp; }