问题
回溯方法: tc:(2^n) 也就是说,指数时间的复杂性(因为我们在每次递归调用时都有两种选择,即要么考虑”index“处的值,要么不考虑 2 这将发生一种可能的结果值 n 次) sc:(2^n)*(n),n 表示临时 arraylist() , 2^n 表示主 arraylist();
class solution { public list<list>> subsets(int[] nums) { list<list>> list = new arraylist(); powerset(nums,0,list,new arraylist<integer>()); return list; } public void powerset(int [] nums, int index , list<list>> list, list<integer> l){ //base case if(index ==nums.length){ list.add(new arraylist(l)); return; } //take l.add(nums[index]); //consider the value at 'index' powerset(nums,index+1,list,l); //dont take; l.remove(l.size()-1);// don't consider the value at 'index' powerset(nums,index+1,list,l); } } </integer></list></integer></list></list>
使用位操作: tc:o(2^n)*n sc:o(2^n)*n,(2^n 表示主列表,n 表示子集列表,并非所有子集的大小都是 n,但我们仍然可以假设情况是这样的)
先决条件:检查i位是否已设置(有关更多详细信息,请参阅位操作提示和技能页) 直觉: 假如都没有。子集表示为二进制值, 例如:如果 n = 三、即数组中有 3 个值。 将有 2^n = 8 个子集 8个子集也可以表示为
index 2
index 1
index 0
subset number
0
0
0
0
0
0
1
1
0
1
0
2
0
1
1
3
1
0
0
4
1
0
1
5
1
1
0
6
1
1
1
7
如果位值是,我们会考虑的 1,则应考虑 nums[] 形成子集中的索引值。 这样,我们就可以创建所有的子集
class Solution { public List<list>> subsets(int[] nums) { List<list>> list = new ArrayList(); int n = nums.length; int noOfSubset = 1 l = new ArrayList(); for(int i =0;i<n for the given subset number find which index value to pick if l.add list.add return list></n></list></list>
以上是电源组的详细内容。请关注图灵教育的其他相关文章!