求一个数组的全部子集的两种解法

一个常见的情景是罗列出[1,2,5,8]的全部子集,结果如下[],[1],[2],[5],[8],[1,2].................

结果有很多,这中解法的题型非常的多,

那么第一种解法就是利用递归,压栈处栈 

基本思想就是,1,2,5,83为一组 

 12 15 18 25 28为一组 

125 128 258为一组 

 1258为一组 

 也就是说固定前面的数字 依次切换

代码如下:

public class CCCC {
	
 
   
    private static List  stack1=new ArrayList();
   private static int[] savenumber=null;
    private static List jieguo=new ArrayList();
 

    public static void di(int index, int ce ,int start)
    {
    	
      for(int i=start;i=0;i--)
		{
			he+=savenumber[stack1.get(i)]+",";
		 }

	     jieguo.add(he);
	     return true;
		
	}
    
    public static int getSum(int[] xx){
	    int sum=0;
	    for(int i=0;i

第二种算法,利用二进制的思想 如 0110 1001 0001 

加入数组为[1,2,5,8]     0110 就代表[ 2,5]  1001 代表[ 1,8]          0表示该数组位置不选,1表示选中

代码如下

z

public class SSSS {
    static int n;
    static List list=new ArrayList();
	public static void get(int x,int[] mm){
	  String sum="";
	  String m=getBinaryValue(x);
	  char[] data=m.toCharArray();
	  for (int i = 0; i < data.length; i++) {
		if(data[i]=='1'){
			sum+=mm[i];
		 }
		  
	  }
	  if(!sum.equals(""))
	  list.add(sum);
	 }
	
	public static String getBinaryValue(int x)
	{
	
	StringBuffer sb = new StringBuffer(Integer.toBinaryString(x));
	int length = sb.length();
	
	for(int j=0;j

当我们得到所以集合时,问题将迎刃而解,

不仅仅数组可以这么做,字符串也可以,当我们学习一种算法,要掌握它的思想,做到举一反三


你可能感兴趣的:(算法,子集合)