字典排序全排列--座標法
阿新 • • 發佈:2018-12-21
在前一篇文章中記錄了字典排序的全排列演算法,但是這有一個前提就是需要保證其中的元素是有序的,因此這篇文章記錄改進的字典有序全排列演算法,額外記錄其中元素的下標,保證下標有序。相當於對下標進行全排列,然後對於生成的座標序列取對應的元素值,構成一個元素序列。
P = [9,8,7,1,2,3,4,...n]
pos = [0,1,2,3,4,....,..m]
pos記錄p陣列中元素的下標值,然後對pos所有元素進行全排列。
public static List<List<Integer>> premuteCoordinate(int[] nums) { List<List<Integer>> result = new ArrayList<>(); List<Integer> posList = new ArrayList<>(); List<Integer> temp = new ArrayList<>(); for (int i = 0; i < nums.length; i++) { // 記錄座標 temp.add(nums[i]); posList.add(i); } result.add(new ArrayList<>(temp)); while (true) { int len = nums.length - 1; int lowIndex = 0; int highIndex = 0; boolean hasFound = false; for (int i = len; i > 0; i--) { if (posList.get(i - 1) < posList.get(i)) { lowIndex = i - 1; hasFound = true; break; } } if (!hasFound) { break; } for (int j = len; j > lowIndex; j--) { if (posList.get(j) > posList.get(lowIndex)) { highIndex = j; break; } } // 交換下標 int t = posList.get(lowIndex); posList.set(lowIndex, posList.get(highIndex)); posList.set(highIndex, t); // 翻轉 for (int k = lowIndex + 1; k <= len; k++, len--) { int l = posList.get(k); posList.set(k, posList.get(len)); posList.set(len, l); } List<Integer> test = new ArrayList<>(); for (int key : posList) { test.add(nums[key]); } result.add(test); } return result; }