刷题的时候在做回溯算法得组合问题时,遇到浅拷贝引起的报错问题
首先看问题
首先下面的代码就会一次浅拷贝问题,这个问题会让result集合中元素都是随着path指向的对象变化而变化,因为result添加的就是path指向的对象,因此想要result不随着path变化,就要让result对path进行深拷贝。
这段代码的结果是[[], [], [], [], [], []]
而结果应该是[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
import java.util.*;
public class backstacking
{
public backstacking() {
}
public static void main(String[] args)
{
backstacking x2=new backstacking();
List<List<Integer>>x= x2.combine(4,2);
System.out.println(x);
}
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> path= new ArrayList<Integer>();
List<Integer> path2;
public List<List<Integer>> combine(int n, int k)
{
backstracking(n,k,1);
return result;
}
public void backstracking(int n,int k,int startindex)
{
if(path.size()==k)
{
// path2=new ArrayList<Integer>();
// for (int i: path)
// {
// path2.add(i);
// }
// result.add(path2);
result.add(path);//这段代码就会出现浅拷贝引起的问题
return ;
}
for(int i=startindex;i<=n;i++)
{
path.add(i);
backstracking(n,k,i+1);
path.remove(path.size()-1);
}
}
}
进行了深拷贝之后的代码是:
import java.util.*;
public class backstacking
{
public backstacking() {
}
public static void main(String[] args)
{
backstacking x2=new backstacking();
List<List<Integer>>x= x2.combine(4,2);
System.out.println(x);
}
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> path= new ArrayList<Integer>();
List<Integer> path2;
public List<List<Integer>> combine(int n, int k)
{
backstracking(n,k,1);
return result;
}
public void backstracking(int n,int k,int startindex)
{
if(path.size()==k)
{
//深拷贝代码开始
path2=new ArrayList<Integer>();
for (int i: path)
{
path2.add(i);
}
result.add(path2);
//深拷贝结束
return ;
}
for(int i=startindex;i<=n;i++)
{
path.add(i);
backstracking(n,k,i+1);
path.remove(path.size()-1);
}
}
}