码迷,mamicode.com
首页 > 其他好文 > 详细

第六篇 Subset

时间:2015-10-17 08:21:53      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

backtrack 经典题

与permutation不同的是每一个中间结果都要加入到最终结果

注意递归时传入的位置是 i + 1 而不是pos+1

时间复杂度O(2^n) 因为一个长度为n的集合有2^n个子集 每个元素可选可不选,两种可能

原先在findSubsets中加入了if(pos == nums.length) return 其实是没有必要的,在这种情况下会直接跳过for循环,这样代码更简洁

 1 public class Solution {
 2     public List<List<Integer>> subsets(int[] nums) {
 3         List<List<Integer>> result = new ArrayList<List<Integer>>();
 4         if (nums == null || nums.length == 0) {
 5             return result;
 6         }
 7         Arrays.sort(nums);
 8         List<Integer> path = new ArrayList();
 9         findSubsets(nums, 0, result, path);
10         return result;
11     }
12     
13     private void findSubsets(int[] nums, int pos, List<List<Integer>> result, List<Integer> path) {
14         result.add(new ArrayList(path));
15         for (int i = pos; i < nums.length; i++) {
16             path.add(nums[i]);
17             findSubsets(nums, i + 1, result, path);
18             path.remove(path.size() -1);
19         }
20     }
21 }

 

第六篇 Subset

标签:

原文地址:http://www.cnblogs.com/ilovenaomi/p/4886864.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!