求幂集
使用回溯法,主要看集合里每一个元素在与不在链表中,在与不在都会创建一个新的解;
import java.util.ArrayList;
import java.util.List;
public class p78 {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
backtrack(nums,0,new ArrayList<Integer>(),result);
return result;
}
//回溯
private void backtrack(int []nums,int start,List<Integer> list,List<List<Integer>> result){
//每次进来都将元素链表加入result
result.add(new ArrayList<>(list));
for(int i=start;i<nums.length;i++){ //无序性,每个元素往后遍历
list.add(nums[i]); //将当前元素加入链表
backtrack(nums,i+1,list,result);
list.remove(list.size()-1); //将最后的元素删除
}
}
}
List的浅拷贝深拷贝问题
List.add(E e)方法会传入一个对象,实际上存的是该对象的引用,因此即使在add方法执行之后再去改变e的值也会导致存放的e的值改变,所以想要存放不同值的e对象就要在每次add()时传入一个e的深拷贝(通常使用new E(e))实现
public class testListAdd {
public static void main(String argv[]){
testListAdd temp=new testListAdd();
temp.test();
}
public void test(){
/**
* 测试string,因为string是不可变的,因此testString="456";时其实是新的对象,所以list一开始存放的"123"未被改变
*/
String
List<String> stringList=new ArrayList<>();
String testString="123";
stringList.add(testString);
testString="456";
System.out.println(stringList.get(0));
/**
* 测试object,因为list存放的是a对象,所以在使用add后再对a操作也会将a的值改变
*/
List<student> studentList=new ArrayList<>();
student a=new student(18);
studentList.add(a);
a.setAge(20);
System.out.println(studentList.get(0).getAge());
/**
* 与object相似,要想add一个不改变的list,只能add一个它的深拷贝new ArrayList(a)
*/
List<List<Integer>> listList=new ArrayList<>();
List<Integer> list1=new ArrayList<>();
list1.add(1);
listList.add(list1);
listList.add(new ArrayList<>(list1));
list1.add(2);
for(List l:listList){
for(Object integer:l){
System.out.print(integer+"--");
}
System.out.println();
}
}
class student{
private int age;
student(){}
student(int age){this.age=age;}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
}
}