算法题LC58:subsets-ii-DFS算法

动态规划:
题目描述
给出一个可能包含重复元素的整数集合S,返回该整数集合的所有子集。
注意:
你给出的子集中的元素要按非递增的顺序排列
给出的解集中不能包含重复的子集
例如:
如果S =[1,2,2], 给出的解集应该是:
[↵ [2],↵ [1],↵ [1,2,2],↵ [2,2],↵ [1,2],↵ []↵]

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:

[↵ [2],↵ [1],↵ [1,2,2],↵ [2,2],↵ [1,2],↵ []↵]
输入描述

输出描述

示例1:
输入

输出
        
看不懂代码可以学习一下下面链接上回溯法的文章,写的挺好的
https://blog.csdn.net/versencoder/article/details/52071930
代码:

import java.util.ArrayList;
import java.util.Arrays;
 
public class Solution {
     
    ArrayList<ArrayList<Integer>> result= new ArrayList<>();
    public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
     
        if (num == null || num.length <= 0)
            return result;
        ArrayList<Integer> temp=new ArrayList<>();
        Arrays.sort(num);
        
        dfs(num,0,temp);
        return result;
    }
     
    public void dfs(int[] num,int start,ArrayList<Integer> temp) {
     
        //if(start>=num.length)return;
        
        result.add(new ArrayList<> (temp));
        for(int i=start;i<num.length;i++) {
     
            if (i>start&&num[i]==num[i - 1])
                continue;
            temp.add(num[i]);
            dfs(num,i+1,temp);
            temp.remove(temp.size()-1);
        }
    }
}

你可能感兴趣的:(算法)