博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
78. Subsets
阅读量:6279 次
发布时间:2019-06-22

本文共 2739 字,大约阅读时间需要 9 分钟。

一、题目

  1、审题

  2、分析

    给出一个整数数组,求其所有的不重复的子数组集合。

 

二、解答

  1、思路:

    方法一、采用回溯法。

      ①、通过确定子集合数组的元素个数进行元素的字典排列。返回的是字典序的有序序列

public List
> subsets(int[] nums) { List
> resultList = new ArrayList
>(); int len = nums.length; if(len == 0) return resultList; int targetLen = 0; while(targetLen <= len) { helper2(resultList, new ArrayList
(), nums, 0, targetLen, len); targetLen++; } return resultList; } private void helper2(List
> resultList, ArrayList
arrayList, int[] nums, int startIndex, int targetLen, int len) { if(0 == targetLen) { resultList.add(new ArrayList<>(arrayList)); return; } for(int i = startIndex; i < len; i++) { arrayList.add(nums[i]); helper2(resultList, arrayList, nums, i+1, targetLen-1, len); arrayList.remove(arrayList.size()-1); } }

  ②、直接将子集合全部返回并进行回溯。

public List
> subsets2(int[] nums) { List
> list = new ArrayList<>(); Arrays.sort(nums); backtrack(list, new ArrayList
(), nums, 0); return list; } private void backtrack(List
> list , ArrayList
tempList, int [] nums, int start){ list.add(new ArrayList<>(tempList)); // 所有子集合全部放入 for(int i = start; i < nums.length; i++){ tempList.add(nums[i]); backtrack(list, tempList, nums, i + 1); tempList.remove(tempList.size() - 1); } }

 

  方法二、直接创建一个 List 存放所有子集,遍历数组;

      每次向 List 中添加新的子集:即所有已经存在子集中添加此次遍历的元素。

    ①、创建新的临时 List:  List<List<Integer>> tmpResultList

public List
> subsets4(int[] nums) { List
> resultList= new ArrayList<>(); resultList.add(new ArrayList
()); for(int num: nums) { // 新建一个 tmpResultList,防止在遍历 resultList 时对其修改抛出 ConcurrentModificationException 异常 List
> tmpResultList= new ArrayList<>(); for(List
list: resultList) { List
tmpList = new ArrayList<>(list); tmpList.add(num); tmpResultList.add(new ArrayList<>(tmpList)); } resultList.addAll(tmpResultList); } return resultList; }

    ②改进

public List
> subsets(int[] nums) { List
> resultList= new ArrayList<>(); resultList.add(new ArrayList
()); for(int num: nums) { int size = resultList.size(); for (int i = 0; i < size; i++) { List
subList = new ArrayList<>(resultList.get(i)); subList.add(num); resultList.add(subList); } } return resultList; }

 

转载于:https://www.cnblogs.com/skillking/p/9692124.html

你可能感兴趣的文章
大数阶乘的位数和精确值计算
查看>>
== 与 is
查看>>
游戏编程入门之隐形的精灵
查看>>
在Windows服务中托管 ASP.NET Core的坑
查看>>
浏览器内核、渲染引擎、js引擎
查看>>
MYSQL学习笔记——连接以及存储过程
查看>>
Dia : linux下的绘图工具
查看>>
html基础
查看>>
BZOJ4259:残缺的字符串——题解
查看>>
synchronize模块
查看>>
echats 饼状图
查看>>
BestCoder Round #1 1001 && 1002 hdu 4857 4858
查看>>
TPYBoard开发板搭建与阿里云服务发送数据
查看>>
Springboot之多环境打包配置
查看>>
ffplay mini 媒体播放器
查看>>
【2016.3.4 】学习小纪
查看>>
ASP.NET MVC 网站开发总结(三) ——图片截图上传
查看>>
解决微信内置浏览器屏蔽下载链接问题
查看>>
进程守护为什么选择pm2
查看>>
JScript读取环境变量的方法
查看>>