• SubSets,SubSets2, 求数组所有子集


    问题描述:

    Given a set of distinct integers, nums, return all possible subsets.

    Note: 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],
      []
    ]
    

    算法分析:第一种方法循环遍历方法,每次在原有集合基础上添加新元素。第二种算法:该类问题属于Backtraking回溯算法。

    public class SubSets
    {
    	//循环遍历法
    	public ArrayList<ArrayList<Integer>> subsets(int[] s)
    	{
    		if(s == null)
    		{
    			return null;
    		}
    		
    		Arrays.sort(s);
    		
    		ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    		
    		for(int i = 0; i < s.length; i ++)
    		{
    			ArrayList<ArrayList<Integer>> temp = new ArrayList<>();
    			//get sets that are already in result
    			for (ArrayList<Integer> a : res) 
    			{
    				temp.add(new ArrayList<Integer>(a));
    			}
    			//add S[i] to existing sets
    			for (ArrayList<Integer> a : temp) 
    			{
    				a.add(s[i]);
    			}
    			//add S[i] only as a set
    			ArrayList<Integer> single = new ArrayList<>();
    			single.add(s[i]);
    			temp.add(single);
    			
    			res.addAll(temp);
    		}
    		//add empty set
    		res.add(new ArrayList<Integer>());
    		
    		return res;
    	}
    	
    	//回溯法
    	public List<List<Integer>> subsets_backtaking(int[] nums)
    	{
    		List<List<Integer>> res = new ArrayList<>();
    		Arrays.sort(nums);
    		dfs(res, new ArrayList<>(), nums, 0);
    		return res;
    	}
    	public void dfs(List<List<Integer>> res, List<Integer> temp, int[] nums, int start)
    	{
    		res.add(new ArrayList<>(temp));
    		for(int i = start; i < nums.length; i ++)
    		{
    			temp.add(nums[i]);
    			dfs(res, temp, nums, i + 1);
    			temp.remove(temp.size() - 1);
    		}
    	}
    }
    

     SubSets2:数组里有重复元素

    Given a collection of integers that might contain duplicates, nums, return all possible subsets.

    Note: The solution set must not contain duplicate subsets.

    For example,
    If nums = [1,2,2], a solution is:

    [
      [2],
      [1],
      [1,2,2],
      [2,2],
      [1,2],
      []
    ]
    
    public class SubSets2
    {	
    	//回溯法
    	public List<List<Integer>> subsets(int[] nums)
    	{
    		if(nums == null)
    		{
    			return null;
    		}
    		Arrays.sort(nums);//千万别忘了排序,否则就出错了,因为这个数组里面有重复元素
    		List<List<Integer>> res = new ArrayList<>();
    		dfs(res, new ArrayList<>(), nums, 0);
    		return res;
    	}
    	public void dfs(List<List<Integer>> res, List<Integer> temp, int[] nums, int start)
    	{
    		res.add(new ArrayList<>(temp));
    		for(int i = start; i < nums.length; i ++)
    		{
    			//skip duplicates
    			if(i > start && nums[i] == nums[i-1])
    			{
    				continue;
    			}
    			temp.add(nums[i]);
    			dfs(res, temp, nums, i + 1);
    			temp.remove(temp.size() - 1);
    		}
    	}
    }
    
     
     
  • 相关阅读:
    latex
    anaconda
    git stash
    YOLO训练Pedestrain
    OpenCL C
    OpenCL
    OpenVX
    caffe源码阅读
    居住证积分查询地址
    jdk 1.8内存逐步增大的一个bug
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5793596.html
Copyright © 2020-2023  润新知