Leetcode演算法Java全解答--47. 全排列 II
阿新 • • 發佈:2018-12-10
Leetcode演算法Java全解答–47. 全排列 II
文章目錄
題目
給定一個可包含重複數字的序列,返回所有不重複的全排列。
示例
輸入: [1,1,2]
輸出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
想法
利用046的方法,多加一個boolean[] visit = new boolean[nums.length];,將已經加入進去的資料設為true
還有個核心就是Arrays.sort(nums); 對陣列進行排序
結果
超過43%的測試案例
時間複雜度/空間複雜度: /
總結
程式碼
我的答案
public List<List<Integer>> permuteUnique(int[] nums) { if (nums.length == 0) { return Collections.EMPTY_LIST; } Arrays.sort(nums); boolean[] visit = new boolean[nums.length]; List<List<Integer>> result = new ArrayList<>(); List<Integer> smallResult = new ArrayList<>(); repick(nums, result, smallResult, visit); return result; } private void repick(int[] nums, List<List<Integer>> result, List<Integer> smallResult, boolean[] visit) { System.out.println("result: " + result.toString() + "smallResult: " + smallResult.toString()); if (smallResult.size() == nums.length) { // result.add(new ArrayList<Integer>(smallResult)); result.add(smallResult); } else { for (int i = 0; i < nums.length; i++) { if (visit[i] || (i > 0 && nums[i] == nums[i - 1] && !visit[i - 1])) { continue; } visit[i] = true; List<Integer> tmp = new ArrayList<>(smallResult); // smallResult.add(nums[i]); tmp.add(nums[i]); repick(nums, result, tmp, visit); // smallResult.remove(smallResult.size() - 1); visit[i] = false; } } }
大佬們的答案
List<List<Integer>> result = new ArrayList<>(); public List<List<Integer>> better(int[] nums) { if (nums.length == 0) { return result; } Arrays.sort(nums); func(new ArrayList<Integer>(), nums, new boolean[nums.length]); return result; } private void func(List<Integer> candidates, int[] nums, boolean[] used) { if (candidates.size() == nums.length) { result.add(new ArrayList<>(candidates)); } //不能直接add(candidates) else { for (int i = 0; i < nums.length; ++i) { if (used[i] || (i != 0 && nums[i] == nums[i - 1] && !used[i - 1])) { continue; } used[i] = true; candidates.add(nums[i]); func(candidates, nums, used); used[i] = false; candidates.remove(candidates.size() - 1); } } }
測試用例
@Test
public void test047() {
// 建立測試案例
int[] arr1 = new int[] { 1, 1, 2 };
// 測試案例期望值
List<List<Integer>> expResult1 = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(1);
list1.add(2);
List<Integer> list2 = new ArrayList<>();
list2.add(1);
list2.add(2);
list2.add(1);
List<Integer> list3 = new ArrayList<>();
list3.add(2);
list3.add(1);
list3.add(1);
expResult1.add(list1);
expResult1.add(list2);
expResult1.add(list3);
// 執行方法
Solution047 solution047 = new Solution047();
List<List<Integer>> result1 = solution047.permuteUnique(arr1);
// 判斷期望值與實際值
Assert.assertEquals(expResult1, result1);
}
其他
程式碼託管碼雲地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git
檢視其他內容可以點選專欄或者我的部落格哈:https://blog.csdn.net/cmqwan
“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改
如有疑問請聯絡,聯絡方式:QQ3060507060