算法题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);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值