31. 下一个排列-LeetCode
心得:求下一个排列数,分三步:
1.找到被替换数
2.找到替换数,交换
3,把被替换数后面的数字逆序。
被替换数是从后往前找,找到第一个后面比前面大的数(!!这说明找过的数都是前面比后面大)把前面的数作为被替代数,替代数之后都是递减的,然后最后再来一次,找到第一个大于被替代数的(这个数肯定存在,因为被替代数后面相邻的肯定大于他),然后交换,交换之后原来被替代数后面的数组还是递减的,因为他小于前面的,并且大于后面的,所以可以通过首尾交换逆序。
代码:
1 class Solution { 2 public void nextPermutation(int[] nums) { 3 int num1=0; 4 if(nums==null||nums.length==1) 5 return; 6 for(int i=nums.length-1;i>0;i--) 7 { 8 if(nums[i-1]<nums[i]) 9 { 10 num1=nums[i-1]; 11 for(int j=nums.length-1;j>i-1;j--) 12 { 13 if(nums[j]>nums[i-1]) 14 { 15 int tmp=nums[j]; 16 nums[j]=nums[i-1]; 17 nums[i-1]=tmp; 18 for(int m=i,n=nums.length-1;m<=n;m++,n--) 19 { 20 int tmp2=nums[m]; 21 nums[m]=nums[n]; 22 nums[n]=tmp2; 23 } 24 return; 25 } 26 } 27 } 28 29 30 } 31 Arrays.sort(nums); 32 } 33 }