31. Next Permutation

https://leetcode.com/problems/next-permutation/discuss/13865/Sharing-my-clean-and-easy-understand-java-code-with-explanation?page=3

在当前序列中,从尾端往前寻找两个相邻元素,前一个记为first,后一个记为second,并且满足first 小于 second。然后再从尾端寻找另一个元素number,如果满足first 小于number,即将第first个元素与number元素对调,并将second元素之后(包括second)的所有元素颠倒排序,即求出下一个序列

example:
6,3,4,9,8,7,1
此时 first = 4,second = 9
从尾巴到前找到第一个大于first的数字,就是7
交换4和7,即上面的swap函数,此时序列变成6,3,7,9,8,4,1
再将second=9以及以后的序列重新排序,让其从小到大排序,使得整体最小,即reverse一下(因为此时肯定是递减序列)
得到最终的结果:6,3,7,1,4,8,9

 

 

 

 

 1 class Solution {
 2     public void nextPermutation(int[] nums) {
 3         if(nums.length <= 1) return;
 4         int i = 0;
 5         for(i = nums.length - 1; i > 0; i--) {
 6             if(nums[i-1] < nums[i]) {
 7                 break;
 8             }
 9         }
10         if(i != 0) {
11             swap(nums, i-1);
12         }
13         reverse(nums, i);
14         
15     }
16     
17     public void swap(int[] nums, int n) {
18         for(int j = nums.length - 1; j > n; j--) {
19             if(nums[j] > nums[n]) {
20                 int temp = nums[j];
21                 nums[j] = nums[n];
22                 nums[n] = temp; 
23                 break;
24             }
25         }
26     }
27     
28     public void reverse(int[] nums, int i) {
29         int last = nums.length - 1;
30         while(i < last) {
31             int temp = nums[i];
32             nums[i] = nums[last];
33             nums[last] = temp;
34             last--;
35             i++;
36         }
37     }
38 }

 

posted @ 2018-09-08 07:51  jasoncool1  阅读(165)  评论(0编辑  收藏  举报