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

一个常见的情景是罗列出[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());
	     }
	}

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

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


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是利用顺序表两个数组子集的C语言代码示例: ``` #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 顺序表的最大长度 typedef struct { int data[MAX_SIZE]; // 顺序表的存储空间 int length; // 顺序表的长度 } SeqList; // 初始化顺序表 void initList(SeqList *list) { list->length = 0; } // 向顺序表中插入元素 void insertList(SeqList *list, int value) { if (list->length >= MAX_SIZE) { printf("顺序表已满,无法插入元素\n"); return; } list->data[list->length++] = value; } // 打印顺序表中的元素 void printList(SeqList *list) { printf("顺序表中的元素为:"); for (int i = 0; i < list->length; i++) { printf("%d ", list->data[i]); } printf("\n"); } // 子集 void subset(SeqList *list1, SeqList *list2) { printf("两个数组子集为:\n"); for (int i = 0; i < list1->length; i++) { for (int j = 0; j < list2->length; j++) { printf("{%d, %d}\n", list1->data[i], list2->data[j]); } } } int main() { SeqList list1, list2; initList(&list1); initList(&list2); // 向顺序表中插入元素 insertList(&list1, 1); insertList(&list1, 2); insertList(&list1, 3); insertList(&list2, 4); insertList(&list2, 5); insertList(&list2, 6); // 打印顺序表中的元素 printList(&list1); printList(&list2); // 子集 subset(&list1, &list2); return 0; } ``` 运行结果: ``` 顺序表中的元素为:1 2 3 顺序表中的元素为:4 5 6 两个数组子集为: {1, 4} {1, 5} {1, 6} {2, 4} {2, 5} {2, 6} {3, 4} {3, 5} {3, 6} ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值