使用递归获取数组的子集。 C ++和Java给了我不同的结果

时间:2015-06-17 04:55:42

标签: java c++ algorithm recursion depth-first-search

例如,给出如下的集合 -

S=[1,3] 

我们希望获得包含以下值的列表列表:

[[],[1],[3],[1,3]] 

我使用C ++和以下代码,它对我来说非常适合。 但是,在我将其更改为Java之后,代码并没有给我正确的结果。

有任何帮助吗?这是我的Java代码:

public static List<List<Integer>> subsetsRecursive(int[] nums){
    List<List<Integer>> res = new ArrayList<List<Integer>>();

    if(nums.length == 0){
        return res;
    }
    ArrayList<Integer> itemList = new ArrayList<Integer>();

    dfs(res, itemList, 0, nums);

    return res;
}

private static void dfs(List<List<Integer>> res, ArrayList<Integer> temp, int end, int[] nums) {
    if(end == nums.length) {
        res.add(temp);
        return;
    }

    temp.add(nums[end]);
    dfs(res, temp, end+1, nums);
    temp.remove(temp.size()-1);
    dfs(res, temp, end+1, nums);   
}

这是C ++:

class Solution {
private:
    vector<vector<int> >res;
public:
    vector<vector<int> > subsets(vector<int> &S) {
        res.clear();

        vector<int>tmpres;
        dfs(S, 0, tmpres);
        return res;
    }
    void dfs(vector<int> &S, int iend, vector<int> &tmpres)
    {
        if(iend == S.size())
            {res.push_back(tmpres); return;}

        tmpres.push_back(S[iend]);
        dfs(S, iend+1, tmpres);
        tmpres.pop_back();

        dfs(S, iend+1, tmpres);
    }
};

1 个答案:

答案 0 :(得分:4)

在线 res.add(temp); temp是一个参考。

每次添加时都会添加对同一列表(itemList)的引用。

尝试将其更改为列表res.add(new ArrayList(temp));,以便它复制列表。