(回溯法)LeetCode#90. Subsets II

来源:互联网 发布:淘宝下架的宝贝在哪里找 编辑:程序博客网 时间:2024/06/14 02:06
  • 题目:给定一个二维nums,数组中包含重复元素,返回所有子集(不能包括重复的子集)
  • 难度:Medium
  • 思路:遍历数组得到所有子集是一个回溯的思想,由于数组中有重复元素,然而子集又不能出现重复,所以需要在回溯方法中额外加入一个标志数组boolean[] flag

    如果flag[i-1]为FALSE并且nums[i]等于nums[i-1],那么说明这次回溯nums[i]应该被过滤
  • 代码:
public class Solution {    public List<List<Integer>> subsetsWithDup(int[] nums) {        List<List<Integer>> result = new ArrayList<>();        if(nums == null || nums.length == 0){            return result;        }        Arrays.sort(nums);        result.add(new ArrayList<Integer>());        backtrack(result, new ArrayList<Integer>(), 0, nums, new boolean[nums.length]);        return result;    }    public void backtrack(List<List<Integer>> list, List<Integer> tmp, int start, int[] nums, boolean[] flag) {        for(int i = start; i < nums.length; i++) {            if(i > 0 && nums[i] == nums[i-1] && flag[i-1] == false) {                continue;            }            tmp.add(nums[i]);            list.add(new ArrayList<>(tmp));            flag[i] = true;            backtrack(list, tmp, i+1, nums, flag);            tmp.remove(tmp.size()-1);            flag[i] = false;        }    }}

Subsets
http://blog.csdn.net/u012559634/article/details/71915687