LeetCode 中级 - 子集

子集

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

分析

和 全排列 的题很像,也可以理解成三成嵌套,不过每一层循环的起点是上一层对应位置+1,这样避免出现123,132这种重复情况

还是给出处理流程

  1. 遍历开始前,先把[]加入list
  2. 第一层i1=0,”1“
  3. 第二层i2=i1+1=1,”12“
  4. 第三层i3=i2+1=2,”123“
  5. 回溯到第二层,i2++后i2=2,”13“
  6. 进入到第三层由于i3=i2+1=3,到边界之外了,直接返回到第二层
  7. 第二层i2++后,i2=3,越界返回第一层
  8. 第一层i1++后,i1=2,”2“
  9. 第二层i2=i1+1=2,“23“,回退
  10. 第一层i1++后,i1=3,”3“,退出

代码

    class Solution {
        //需要好好理解!!!
        //可以跑一边代码对照输出顺序理解实现过程
        public List<List<Integer>> subsets(int[] nums) {
            List<List<Integer>> list = new ArrayList<>();
            if(nums.length ==0){
                return list;
            }
            backtrack(list,new ArrayList<Integer>(),nums,0);
            return list;
        }
        private void backtrack(List<List<Integer>> list,List<Integer> temp,int[] nums,int begin){
            list.add(new ArrayList<Integer>(temp));
            for(int i=begin;i<nums.length;i++){
                temp.add(nums[i]);
                backtrack(list,temp,nums,i+1);
                temp.remove(temp.size()-1);
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/whdalive/article/details/80422429