/* * 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--); }