leetCode上题目原文如下:
Given a set of distinct integers, nums, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3]
, a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
分析:题目意思就是类似于给定一个集合元素,求它的所有子集,并且要求子集内的元素按照非递减序列排。
那么在求解时候第一步先对给定的数组进行排序,然后拿到排序后的结果。在求得了nums[0,i-1]的全部子集P之后,nums[0..i]的子集就是之前的全部子集P并上由所有的P中的各个子集加上nums[i]。比如{1,2,3,4},在知道{1,2}的子集为空集,{1},{2}再求{1,2,3}的子集只需要在前面四个子集的基础上再让这四个子集分别加上3,即得到{1,2,3}的8个子集。
实现代码如下:
(
第一次做的时候题目要求每个子集内的元素按照非递减排序,所以我先给数组进行了一次排序,但是目前题目改成了不要求子集内的元素按照非递减排序,所以就不需要先排序了。
)
public class Subsets {
public int partition(int A[], int low, int high) {
int pivot = A[high];
int i = low - 1;
for (int j = low; j < high; j++) { // 保证所有比pivot小的元素都放在A[low]...A[i]中
if (A[j] <= pivot) {
i++;
int temp = A[j];
A[j] = A[i];
A[i] = temp;
}
}
int temp2 = A[high];
A[high] = A[i + 1];
A[i + 1] = temp2;
return i + 1;
}
public void quick_sort(int A[], int low, int high) {
if (low < high) {
int mid = partition(A, low, high);
quick_sort(A, low, mid - 1);
quick_sort(A, mid + 1, high);
}
}
/**@author
* @date 20151015
* 感觉是动态规划的思想
* 求集合的子集只需要先求前面的子集,比如{1,2,3},在知道{1,2}的子集为空集,{1},{2}再求{1,2,3}的子集只需要在前面四个子集的基础上再让这四个子集分别加上3,即得到最后的8个子集
* @param nums
* @return
*/
public List<List<Integer>> subsets(int[] nums) {
quick_sort(nums, 0, nums.length-1);//第一步对元素进行排序
List<List<Integer>> resultList = new LinkedList<List<Integer>>();
List<Integer> list = new LinkedList<Integer>();
resultList.add(list);
int length = nums.length;
for(int index=0;index<length;index++){
int resultSize = resultList.size();//先获取得到之前的子集个数
for(int re=0;re<resultSize;re++){//在目前子集的基础上加分别由各个子集加上新增的元素
list = resultList.get(re);
/*必须要加后面下面的两行,因为如果不加的话在resultList.get(re)得到的一个链表的引用,那样的list的内容会被覆盖*/
List<Integer> newlist = new LinkedList<Integer>();
newlist.addAll(list);//把从现有结果中得到的list的值全部赋给新的list
newlist.add(nums[index]);//newlist再加上当前的数组元素
resultList.add(newlist);
}
}
return resultList;
}
public static void main(String[] args) {
Subsets test = new Subsets();
int[] nums ={3,2,1};
test.subsets(nums);
List<List<Integer>> result = test.subsets(nums);
for(int i=1;i<result.size();i++){
System.out.print("i = "+i+": [");
List<Integer> list = result.get(i);
for(int j=0;j<list.size();j++){
System.out.print(list.get(j)+" ");
}
System.out.println();
}
// for(int i=0;i<nums.length;i++){
// System.out.println(nums[i]);
// }
}
}
类似的题目是
https://leetcode.com/problems/subsets-ii/
http://blog.csdn.net/u010339647/article/details/52300162