题目内容
Java代码
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
for(int i=0 ; i<nums.length ; i++){
int size = result.size();
for(int j=0 ; j<size ; j++){
List<Integer> temp = new ArrayList<>(result.get(j));
temp.add(nums[i]);
result.add(temp);
}
}
return result;
}
}
解题思路
- 首先向result中添加空集,之后从前向后遍历数组,每遇到一个数,就把这个数与result中所有的集合组成新的子集添加到result中。
- 也可以用回溯法,DFS(深度优先遍历)等,回溯法目前还不是很清楚,后面进行学习。
- 关于下面这行代码
List<Integer> temp = new ArrayList<>(result.get(j));
这里也给出javadoc中关于构造方法的描述
- 这里想着重写一下编码过程中遇到的问题,关于这一句的写法
List<Integer> temp = new ArrayList<>(result.get(j));
如果写成下面这样,结果就会出现很大的错误
List<Integer> temp = new ArrayList<>();
temp = result.get(i);
经过在eclipse里尝试后发现,如果按下面这样写,当代码执行到第三行为temp添加了元素之后,还没有添加到result里面,result里面的元素就已经改变了。
List<Integer> temp = new ArrayList<>();
temp = result.get(i);
temp.add(nums[i]);
result.add(temp);
例如第一次循环中,result的值是[[]]
(只有一个空集),执行了temp = result.get(i)
后,temp变为[]
,再执行temp.add(nums[i])
后(这里nums[i]
是1),temp变为[1]
,此时还未执行result.add(temp)
,然而我打印result发现,此时result已经变成了[[1]]
,如果此时再执行result.add(temp)
,result就变成了[[1],[1]]
,正确的result应该是[[],[1]]
。
这个问题一直没有解决。