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 }

 

posted @ 2019-05-21 20:43  pc_m  阅读(111)  评论(0编辑  收藏  举报