基础班 Subsets 给定一个含不同整数的集合,返回其所有的子集

在这里插入图片描述

//用的搜索算法  深度优先搜索  寻找xxx 仍然考你是否会写递归
class Solution{
	public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] nums){
		//把所有的都找出来再去重,[1,1,1,1,1]的子集2^5时间复杂度极高
		//return 一个result
		ArrayList<ArrayList<Integer>> results=new ArrayList<>()
		//异常判断
		if(nums==null||nums.length==0){
			return results;
		}
		
		Arrays.sort(nums);
		
		ArrayList<Integer>subset=new ArrayList<>()
		subsetsHelper(nums,0,subset,results)
		//这个函数是把数组中0开始当日按subset开头的所有元素都放进去
		return results;
	}
	//因为只被自己调了,没必要给外面知道
	private void subsetsHelper(int[] nums,
	                           int startIndex,
							   ArrayList<Integer> subset,
							   ArrayList<ArrayList<Integer>> results){
		//deep copy subset&add to results
		results.add(new ArrayList<Integer>(subset));
		
		for(int i =startIndex;i<nums.length;i++){
			if(i!=0&&nums[i]==nums[i-1]&&i>startIndex){
				comtinue;
			}
			subset.add(nums[i]);
			//挑出来[1,2]只能从3再开始 i+1
			subsetsHelper(nums,i+1,subset,results)
			subset.remove(subset.size()-1);
		}	
    }
}		
	


所有的递归搜索,先加一个数进去,再把它挪掉,就是回溯
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。
subset.add(nums[i]);
subset.remove(subset.size()-1);

这个part是个套路,记住
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

发布了39 篇原创文章 · 获赞 1 · 访问量 443

猜你喜欢

转载自blog.csdn.net/qq_40647378/article/details/103982776