题目:
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subsets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
这个题目的思路比较清奇:
使用两层循环,第一层循环控制新获取的数字的位置,第二层循环碰到一个数字就将其加入到原列表(即一个子集)中,即可形成一个新的子集。总的来说,这个题目使用遍历的方法解决,但是思路很清奇,很有意思2333333
详细情况可以参考实现代码已经自己写的注释部分,很好理解
实现:
JAVA版:
package leetcode;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/*
USER:LQY
DATE:2020/8/14
TIME:9:00
*/
public class leetcode_78 {
public static void main(String []args){
}
public List<List<Integer>> subsets(int[] nums) {
LinkedList<List<Integer>> ans = new LinkedList<>();
ans.add(new LinkedList<>()); //这个很关键。必须保证有一个空集。
int n = nums.length;
for(int i = n-1;i >= 0;i--){
int v = nums[i]; //即将新添加的数
int size = ans.size();
for(int j = 0;j < size;j++){
//先依次取出已经形成的子集
List<Integer> temp = new LinkedList<>(ans.get(j));
//此时的temp中放的就是一个子集
// 再向原子集中添加当前的新数字,从而得到一个新的子集
temp.add(v);
// 最后将这个新子集添加到结果集中
ans.add(temp);
}
}
return ans;
}
}