LeetCode: 31. Next Permutation (Medium)

1. 原题链接

https://leetcode.com/problems/next-permutation/description/

2. 题目要求

给出一个整型数组,让我们给出下一个排序情况。注意以下规则:

(1)下一个排列必须比原排列要大。例如“1,2,4,5,3”,下一个排列为“1,3,4,5,2”,比之前的排列要大;

(2)如果给出的数组已经按降序排列则下一个排列必须是升序排列。例如“5,4,3,2,1”为降序,下一个排列必须为升序“1,2,3,4,5”;

全排列概念:

3. 解题思路

从后向前找到,前一个元素 nums[ i ] 小于后一个元素 nums[ i+1 ] 的位置。然后在从后向前找到 刚好大于nums[ i ] 的元素 nums [ j ],交换 nums[ i ] 和 nums[ j ] 。最后将nums[ i ] 之后的元素进行逆置。

4. 代码实现

 1 public class NextPermutation31 {
 2     public static void main(String[] args) {
 3         int[] nums ={1,2,4};
 4         NextPermutation31 np =new NextPermutation31();
 5         for(int x:np.nextPermutation(nums))
 6             System.out.println(x);
 7 
 8     }
 9     public int[] nextPermutation(int[] nums) {
10 
11         int i = nums.length - 2;
12         while (i >= 0 && nums[i + 1] <= nums[i]) {
13             i--;
14         }
15 
16         if (i >= 0) {
17             int j = nums.length - 1;
18             while (j >= 0 && nums[j] <= nums[i]) {
19                 j--;
20             }
21             swap(nums, i, j);
22         }
23         reverse(nums,i+1,nums.length-1);
24 
25         return nums;
26 
27     }
28 
29     public void swap(int[] nums, int i, int j) {
30         int temp = nums[i];
31         nums[i] = nums[j];
32         nums[j] = temp;
33     }
34 
35     public void reverse(int[] nums, int start, int end) {
36         while (start < end) {
37             swap(nums, start, end);
38             start++;
39             end--;
40         }
41     }
42 
43 }

 

posted @ 2018-01-03 15:54  一只敲码的猫  阅读(177)  评论(0编辑  收藏  举报