/* * 31. Next Permutation * 2016-4-18 by Mingyang * 这道题目开始自己想还不是很容易找到规律!!你比如说一个从后往前增加的序列就不需要next premutation,但是一旦遇到一个减少的数 * 比如2,3,6,5,4,1 * 1) 先从后往前找到第一个不是依次增长的数,记录下位置first。比如例子中的3,对应的位置是first; 2) 接下来分两种情况: * (1)如果上面的数字都是依次增长的 * ,那么说明这是最后一个排列,下一个就是第一个,其实把所有数字反转过来即可(比如(6,5,4,3,2,1)下一个是(1,2,3,4,5,6)); * (2) 否则,如果first存在,从First开始往后找,找到第一个比他大的数,然后两个调换位置,比如例子中的4。 * 调换位置后得到(2,4,6,5,3,1)。最后把p之后的所有数字倒序.2,4,1,3,5,6 */ // http://blog.csdn.net/linhuanmars/article/details/20434115 public void nextPermutation(int[] num) { int n = num.length; if (n < 2) return; int index = n - 1; while (index > 0) { if (num[index - 1] < num[index]) break; index--; } if (index == 0) { reverseSort(num, 0, n - 1); return; } else { int val = num[index - 1]; int j = n - 1; while (j >= index) { if (num[j] > val) break; j--; } swap(num, j, index - 1); reverseSort(num, index, n - 1); return; } } private void swap(int[] num, int i, int j) { int tmp = num[i]; num[i] = num[j]; num[j] = tmp; } private void reverseSort(int[] num, int i, int j) { while (i < j) swap(num, i++, j--); }