首页 > 其他 > 详细

第六篇 Subset

时间:2015-10-17 08:20:05      阅读:109      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!