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 }