使用递归获取数组的子集。 C++ 和 Java 给我不同的结果
Use Recursion to get Subsets of an array. C++ and Java give me different results
例如,给定如下的集合 -
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);
}
};
行内
res.add(temp);
temp 是参考。
您每次添加时都在添加对同一个列表 (itemList) 的引用。
尝试将其更改为列表 res.add(new ArrayList(temp));
以便它复制列表。
例如,给定如下的集合 -
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);
}
};
行内
res.add(temp);
temp 是参考。
您每次添加时都在添加对同一个列表 (itemList) 的引用。
尝试将其更改为列表 res.add(new ArrayList(temp));
以便它复制列表。