Leetcode 题解 - 搜索--Backtracking(20):含有相同元素求子集
2019-05-28 15:46
288 查看
[LeetCode] Subsets II 子集合之二
Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S =
[1,2,2], a solution is:
[code][ [2], [1], [1,2,2], [2,2], [1,2], [] ]
与上一题唯一的区别在于:要去重,去重写法已经写了无数遍了 但是记住这种写法的前提是数组是有序数组,你重复的数值是连续排列的,不然并不能去掉重复的结果
[code]class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { Arrays.sort(nums); List<List<Integer>> subset = new ArrayList<>(); List<Integer> subsetList = new ArrayList<>(); boolean[] visited = new boolean[nums.length]; for(int i=0; i <= nums.length; i++) help(subset, subsetList, visited, 0, i, nums); return subset; } private void help(List<List<Integer>> subset, List<Integer> subsetList, boolean[] visited, int start, final int size, final int[] nums){ if(subsetList.size() == size){ subset.add(new ArrayList<>(subsetList)); return; } for(int i = start; i < nums.length; i++){ if(i != 0 && nums[i] == nums[i - 1] && !visited[i - 1]) continue; visited[i] = true; subsetList.add(nums[i]); help(subset, subsetList, visited, i + 1, size, nums); subsetList.remove(subsetList.size() - 1); visited[i] = false; } } }
第二次写
与之前的区别是每次设置size改成每次都添加而已
[code]class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { List<List<Integer>> result = new ArrayList<>(); List<Integer> list = new ArrayList<>(); Arrays.sort(nums); result.add(new ArrayList()); boolean[] visited = new boolean[nums.length]; help(list, result, nums, 0, visited); return result; } private void help(List<Integer> list, List<List<Integer>> result, int[] nums, int start, boolean[] visited){ for(int i = start; i < nums.length; i++){ if(i >= 1 && nums[i] == nums[i-1] && !visited[i-1]) continue; visited[i] = true; list.add(nums[i]); if(list.size() <= nums.length) result.add(new ArrayList(list)); help(list, result, nums, i+1, visited); list.remove(list.size() - 1); visited[i] =false; } } }
换个写法 都一样 方便理解整个回溯调用的过程
[code] class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { List<List<Integer>> result = new ArrayList<>(); List<Integer> list = new ArrayList<>(); Arrays.sort(nums); // result.add(new ArrayList()); boolean[] visited = new boolean[nums.length]; help(list, result, nums, 0, visited); return result; } private void help(List<Integer> list, List<List<Integer>> result, int[] nums, int start, boolean[] visited){ if(list.size() <= nums.length){ result.add(new ArrayList(list)); } for(int i = start; i < nums.length; i++){ if(i >= 1 && nums[i] == nums[i-1] && !visited[i-1]) continue; visited[i] = true; list.add(nums[i]); // if(list.size() <= nums.length) // result.add(new ArrayList(list)); help(list, result, nums, i+1, visited); list.remove(list.size() - 1); visited[i] =false; } } }
相关文章推荐
- Leetcode 题解 - 搜索--Backtracking(21):分割字符串使得每个部分都是回文数
- LeetCode 题解 169. Majority Element(查找多数元素)
- LeetCode题解(python)-20. 有效的括号
- leetcode题解-20.有效的括号
- 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)
- Leetcode 82 删除排序链表中的重复元素 II Python C++ 史上最详细题解系列
- 找出两个含有相同元素个数的递增数列中第n小的数
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 比较两集合(list/set..)元素是否相等(只要 List 含有相同元素(String Type)就可以,允许重复)...
- 【leetcode】搜索范围(二分查找升序数组target元素上下界)
- Leetcode题解 - 20. Valid Parentheses
- 算法实验一:二分查找算法改进: 当搜索元素x不存在时,返回小于x的最大元素位置i和大于x的最小元素位置j. 当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
- Flood Fill:搜索二维数组中相邻的相同元素并替换
- leetcode 题解:Remove Duplicates from Sorted Array II(已排序数组去三次及以上重复元素)
- leetcode题解-13. Roman to Integer && 14. Longest Common Prefix && 20. Valid Parentheses
- Leetcode 079 搜索单词 Python C++ 史上最详细题解系列
- [leetcode 250]Count Univalue Subtrees ------元素都相同的子树个数
- LeetCode (20) house robber (数组不相邻元素最大值)
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- Leetcode 81 搜索旋转排序数组 II Python C++ 史上最详细题解系列