[leetcode] 90. 子集 II.md
阿新 • • 發佈:2018-08-06
重復 while blog bin sub set 元素 solution 出現
90. 子集 II
78. 子集題的擴展,其中的元素可能會出現重復了
我們仍沿用78題的代碼,稍作改動即可:
- 此時需要對nums先排個序,方便我們後面跳過選取相同的子集。
- 跳過選取相同的子集。當選取完第i個數時,如果後面的數,和當前數相同,就跳過,不必對其進行遞歸了。
class Solution { private void dfs(int n, int k, int last, int[] nums, List<Integer> cur, List<List<Integer>> ans) { if (k == 0) { ans.add(new ArrayList<>(cur)); return; } for (Integer i = last + 1; i <= n; i++) { cur.add(nums[i - 1]); dfs(n, k - 1, i, nums, cur, ans); cur.remove(((Integer) nums[i - 1])); // 對於後面的數,如果和當前數相同,就跳過。 while (i > 0 && i < n && nums[i] == nums[i - 1]) i++; } } public List<List<Integer>> subsetsWithDup(int[] nums) { Arrays.sort(nums); List<List<Integer>> ans = new ArrayList<>(); List<Integer> cur = new ArrayList<>(); for (int k = 0; k <= nums.length; k++) { dfs(nums.length, k, 0, nums, cur, ans); } return ans; } }
[leetcode] 90. 子集 II.md