标签:
https://oj.leetcode.com/problems/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
解题思路:
开始以为这道题一定有比较理论化的方法,例如求所有的permutation用DFS。想了半天发现也没什么好的办法,只能笨方法来做。
观察题目的例子,如果原来的数组是倒序排列的,那么肯定是最大的组合。也就是说,一个倒序排列的数字不能变得更大。那么从后往前找到第一个突然变小的数字A,然后将这个数组往右,仅仅大于它一点的那个数字B和它交换位置。再将这个A往右的数字正向排序。就得到了一个仅仅比当前数组大一点的数组。特别要注意最后一步的排序不能忘记。
所以有如下的过程:
1. 从右往左,找出num中第一个变小的数字A。如果不存在这样的A,直接将num正向排列并返回。
2. 找出A往右的数字中,大于A且最接近于A的数字B。
3. 将B与A交换位置。
4. 将A原来的位置开始往右的数字正向排序。
public class Solution { public void nextPermutation(int[] num) { if(num.length == 0 || num.length == 1){ return; } //找出从后往前第一个变小的数字,比如354221中的3 int swapIndex = -1; for(int i = num.length - 1; i > 0; i--){ if(num[i] > num[i - 1]){ swapIndex = i - 1; break; } } //如果num一直递减,就直接返回排序后的数组 if(swapIndex == -1){ Arrays.sort(num); return; } //将num[swapIndex]与从后往前第一个比它大的数字交换 for(int i = num.length - 1; i > swapIndex; i--){ if(num[i] > num[swapIndex]){ int temp = num[i]; num[i] = num[swapIndex]; num[swapIndex] = temp; break; } } //交换后一定要再对后面的排序,已保证是最小的组合 //不排序的结果Input:[1,3,2],Output:[2,3,1],Expected:[2,1,3] Arrays.sort(num, swapIndex + 1, num.length); } }
标签:
原文地址:http://www.cnblogs.com/NickyYe/p/4318723.html