Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]
have the following unique permutations:
[1,1,2]
, [1,2,1]
,
and [2,1,1]
.
思路,使用字典序法,与http://blog.csdn.net/mlweixiao/article/details/38897499 代码除了函数名换了以外,没有任何改动
public class Solution { private void nextPermutation(int[] num) { int i; int cur = -1; int temp; // find the last increase sequence for (i = num.length - 1; i >= 1; i--) { if (num[i] > num[i - 1]) { cur = i - 1; break; } } // if the increase sequence exists, // swap the cur and the last one(bigger than it) if (cur != -1) { for (i = num.length - 1; i > cur; i--) { if (num[i] > num[cur]) { temp = num[cur]; num[cur] = num[i]; num[i] = temp; break; } } } for (i = cur + 1; 2 * i <= cur + num.length - 1; i++) { temp = num[i]; num[i] = num[num.length - i + cur]; num[num.length - i + cur] = temp; } } @SuppressWarnings({ "rawtypes", "unchecked" }) public List<List<Integer>> permuteUnique(int[] num) { Arrays.sort(num); int[] temparray = new int[num.length]; System.arraycopy(num, 0, temparray, 0, num.length); ArrayList<List<Integer>> result = new ArrayList<List<Integer>>(); for (;;) { List list = new ArrayList<Integer>(); // 注意不能使用list.addAll(Arrays.asList(num)); // 也不能使用Collection.addAll(list ,num); // Arrays.asList() 返回java.util.Arrays$ArrayList, // 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList, //remove,add等method在AbstractList中是默认throw // UnsupportedOperationException而且不作任何操作。 // for (int i = 0; i < num.length; i++) { list.add(num[i]); } result.add(list); nextPermutation(num); if (Arrays.equals(num, temparray)) break; } return result; }
时间: 2025-01-08 21:26:03