题目描述

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

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

示例:

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

解题思路

回溯法

设置一个头指针int first和一个当前列表ArrayList<Integer> curList,每次(递归地)进入回溯方法时,先将当前列表curList加入结果列表,再对数组从头指针first到尾部进行遍历,每次遍历都分三步:

  1. 在当前列表curList加入当前指针对应的数组的元素nums[i]
  2. (递归地)处理剩下的i+1nums.length - 1个元素
  3. 回溯,删掉刚才用过的元素(尾部元素)

Java 实现

public List<List<Integer>> subsets (int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
backtrack(0,new ArrayList<>(),ans,nums);
return ans;
} private void backtrack (int first, ArrayList<Integer> curList, List<List<Integer>> ans,int[] nums) {
ans.add(new ArrayList<Integer>(curList));
for (int i = first; i < nums.length;i++) {
curList.add(nums[i]);
backtrack(i+1,curList,ans,nums);
curList.remove(curList.size()-1); // 回溯,删掉用过的元素
}
}

心得体会

这一题有点像第17题-电话号码的字母组合,回溯算法都体现在处理完一次递归后,要将刚才用过的尾部元素删掉,不同之处在于,这一题不需要在达到固定长度时将当前列表加入结果列表,而是每次进入回溯方法时,都加一次。

最新文章

  1. XMLHttpRequest简介
  2. FCN网络的训练——以SIFT-Flow 数据集为例
  3. C#命名规范的几点建议
  4. 与你相遇好幸运,Tippecanoe用法
  5. CSS 选择器【详解】
  6. 操作集合的工具类:Collections
  7. Android底部TabHost API
  8. jQuery - Chaining
  9. 一次GC问题定位
  10. Android真机抓屏- Android Screen Monitor
  11. JQuery 分页实现
  12. U盘安装CentOS7
  13. Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚
  14. PostgreSQL9.1 with PostGIS 2.1.4 for mapping coordinates on linux/ubuntu 已经打包成deb 可下载
  15. Android Api 检查參数状态Api
  16. jQuery函数学习
  17. mysql5.5.28在Linux下的安装
  18. HDU - 5073 Galaxy(数学)
  19. PAT 1038 统计同成绩学生
  20. abap 通过importing 和 exporting 调用其它函数

热门文章

  1. kubernetes CRD开发指南
  2. Spark 系列(五)—— Spark 运行模式与作业提交
  3. abc -- 牛客
  4. 01、VM安装教程
  5. Spring Boot 2.X 如何快速整合jpa?
  6. io流处理文件夹复制功能(java代码)
  7. (十一)c#Winform自定义控件-列表
  8. 决策树ID3原理及R语言python代码实现(西瓜书)
  9. idea实现第一个springboot程序
  10. Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件