Leetcode 31. Next Permutation
Posted Deribs4
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 31. Next Permutation相关的知识,希望对你有一定的参考价值。
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1
思路:对于[a0,a1,...,an]中的ai,如果满足ai>=ai-1>=...>=an,那么序列[ai,ai-1,...,an]就是由构成的序列的ai,ai-1,...,an最大序列,对应的由构成的最小序列就是将最大序列反转的[an,an-1,...,ai]。对于当前序列[a0,a1,...,an],如果存在比之更大的序列,那么新的序列A应该是比当前序列大的序列中最小的。由后向前看:
1.如果an>an-1,那么只要交换an和an-1就可以得到序列A。
2.an-1>=an时,如果an-2比an-1小的话,例如an-1>an-2>=an,只要替换an-2和an-1,就可以得到序列A。
...
可以看到,如果ai不满足ai>=ai-1>=...>=an对,只要在ai-1,...,an中找到大于ai的最小值ak,交换ai和ak,然后将ai-1,...,ai,...,an反转,就可以得到序列A。首先a1,...,ai+1不变,将ai和ak交换后,仍然满足ai-1>=...>=ai>=...>=an,将[ai-1,ai,..,an]反转,就可以得到离[ai,...,ak,...,an]最近的大于的序列[ak,an-1,...,ai,...,ai-1],这样就控制了变换后第i位是当前情况的最小值,然后剩余元素又组成了剩余元素可以组成的最小值。
代码:
1 public class Solution { 2 public void nextPermutation(int[] nums) { 3 int i, j; 4 for (i = nums.length - 2; i >= 0 && nums[i] >= nums[i+1]; --i); 5 if (i >= 0) { 6 for (j = i + 1; j < nums.length && nums[i] < nums[j]; ++j); 7 swap(nums, i, j - 1); 8 } 9 i++; 10 j = nums.length - 1; 11 while (i < j) { 12 swap(nums, i++ ,j--); 13 } 14 } 15 public void swap(int[] nums, int i, int j) { 16 nums[i] += nums[j]; 17 nums[j] = nums[i] - nums[j]; 18 nums[i] -= nums[j]; 19 } 20 }
以上是关于Leetcode 31. Next Permutation的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode OJ 31. Next Permutation
[array] leetcode - 31. Next Permutation - Medium