9.Subsets

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


基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip 【备注】 1、该资源内项目代码百分百可运行,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值