根据题意,找到几何中的所有子集,说实话子集是没有什么头绪的,因为如果采用遍历的方法,稍有遗漏不说,代码的嵌套循环层数随着数组大小的增加而增加,想了很久没有头绪后就去看了看评论,然后就被点破了解题的关键:遍历数组时,让当前这一元素构成的集合,分别去加上之前找到的所有子集,由于第一次找到的子集一定有两个,一个为空,一个带有一个元素,那么用当前元素组成的集合分别加上之前的集合,一定会有一个集合只有当前元素
如图:
由于采用遍历的方式,对于数组长度为N,指针没往前走一次,要遍历的子集数量是原来的2倍,所以此算法的时间复杂度就是等比数列求和后的复杂度,即为O(2^N)
以下是代码:
1 package algorithm; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class SubCollection { 7 public List<List<Integer>> subsets(int[] nums) { 8 9 List<List<Integer>> totalSubLists = new ArrayList<>(); 10 11 for (int i = nums.length-1; i >=0; i--) { 12 if(totalSubLists.size()==0){ 13 List<Integer> self = new ArrayList<>(); 14 self.add(nums[i]); 15 totalSubLists.add(self); 16 totalSubLists.add(new ArrayList<>()); 17 }else { 18 int size = totalSubLists.size(); 19 int se=0; 20 while (true){ 21 List<Integer> self = new ArrayList<>(); 22 self.add(nums[i]); 23 self.addAll(totalSubLists.get(se++)); 24 totalSubLists.add(self); 25 if(se >= size){ 26 break; 27 } 28 29 } 30 } 31 } 32 33 return totalSubLists; 34 } 35 36 }
原文地址:https://www.cnblogs.com/Kaithy-Rookie/p/11323603.html
时间: 2024-11-07 20:47:56