1. 程式人生 > >求一個數組的全部子集的兩種解法

求一個數組的全部子集的兩種解法

一個常見的情景是羅列出[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<Integer>  stack1=new ArrayList<Integer>();
   private static int[] savenumber=null;
    private static List<String> jieguo=new ArrayList<String>();
 

    public static void di(int index, int ce ,int start)
    {
    	
      for(int i=start;i<savenumber.length;i++)
    	{
    		stack1.add(i);
    		if(ce==index)
        	{
        		yan();
        	}else{
        		
        	di(index,ce+1, i+1);
        		
        	}
    		stack1.remove(stack1.size()-1);
    	}
     }
    public static boolean yan() {
    	
    	
		String he="";
		for(int i=stack1.size()-1;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<xx.length;i++){
	        sum+=xx[i];
	    }
	    return sum;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	 Scanner scanner=new Scanner(System.in);
	   while(scanner.hasNextInt()){
         Integer num=	scanner.nextInt();
	   savenumber=new int[num];
	
           for(int i=0;i<num;i++)
           {
        	   savenumber[i]=scanner.nextInt();
           }
        
          for(int ceng=1;ceng<=num;ceng++)
          {
        	  di(ceng,1,0);
          }
          System.out.println(jieguo.toString());
          
	   }
	}

第二種演算法,利用二進位制的思想 如 0110 1001 0001 

加入陣列為[1,2,5,8]     0110 就代表[ 2,5]  1001 代表[ 1,8]          0表示該陣列位置不選,1表示選中

程式碼如下

z

public class SSSS {
    static int n;
    static List<String> list=new ArrayList<String>();
	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<n-length;j++){
       sb.insert(0, "0");
	}
	
	return sb.toString();
	
  }
	
	public static int getSum(int[] xx){
	    int sum=0;
	    for(int i=0;i<xx.length;i++){
	        sum+=xx[i];
	    }
	    return sum;
	}
	public static void main(String[] args) {
         Scanner in = new Scanner(System.in);
	     while(in.hasNextInt()){
	    	 int[] mm;
	    	 n=in.nextInt() ;//注意while處理多個case
		    
		      mm=new int[n];
		      for(int i=0;i<n;i++){
		          mm[i]=in.nextInt() ;
		        
		      }
		      for (int i = 0; i < Math.pow(2, n)-1; i++) {
				  get(i, mm);
			}  
		      System.out.println(list.toString());
	     }
	}

當我們得到所以集合時,問題將迎刃而解,

不僅僅陣列可以這麼做,字串也可以,當我們學習一種演算法,要掌握它的思想,做到舉一反三