c语言求一个整数集合的各个子集的数字和并比较大小,列出和最大的子集

c语言求一个整数集合的各个子集的数字和并比较大小,列出和最大的子集,第1张

这是个经典算法:

#include "stdioh" 

int maxa(int  a,int l,int s,int e)   /用s和e 记录子数组起始和终止地址,l是数组长度/

{

 int summax=0;  /最大子数组的和/

 int sumcur=0;    /当前和/

 int i; 

 s=0;e=0;

 for(i=0;i<l;i++)

 {  

  sumcur+=a[i];

  if(sumcur>summax)

  {

   summax=sumcur;

   e=i;

  }

  else if(sumcur<0)

  {

   sumcur=0;

   s=i+1;

  }  

 }

 if(summax<=0)   

 {

  summax=a[0];

  for(i=0;i<l;i++)

  {

   if(summax<a[i])

   {

    summax=a[i];

    s=i;

    e=i;

   }

  }

 }

 return summax;

}

int main() 

 int a[]={1,-2,3,10,-4,7,2,-5};

 int start,end; 

 printf("最大子数组的和为:%d\n",maxa(a,8,&start,&end));

 printf("最大子数组的元素下标从%d到%d:\n",start,end); 

 while(start<=end)

 {

  printf("%d  ",a[start++]);

 }

 printf("\n");

 return 0; 

}

结果:

import javautilArrayList;

import javautilList;

public class strSplit {

  public static void main(String args[])

  {

   List<String> list1 = new ArrayList<String>();

   List<String> list2 = new ArrayList<String>();

   list1add("g");

   list1add("s");

   list1add("a");

   list1add("f");

   list2add("g");

   list2add("c");

   list2add("b");

   list2add("a");

   //取交集

   list1retainAll(list2);

   Systemoutprint(list1);

   //取补集

     //list1removeall(list2);

 // Systemoutprint(list1);

  }

}

一、问题描述

Given a set of distinct integers, nums, return all possible subsets (the power set)

Example:

Input: nums = [1,2,3]

Output:

[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

[]

]

二、解决思路

思路一:按照一般想法,先计算只有1个元素的子集合,然后再遍历数组元素,在其基础上,再添加一个元素,但要保证2个元素子集合中数不能重复,并且需要从子集中去重,直到集合元素个数和数组长度相等

思路二:思路一的角度是按照子集元素考虑,可以换个角度进行思考,从数组中元素角度着手,第二个元素是在前所有子集上,加上第二个元素及其本身,一直递归即可求出所有子集

思路三:参考solution的解决思路三,数组集合的子集个数为2的n次方(其中n为数组个数,下面会进行简单解释),我们可以发现0 - (2^n - 1)的二进制中1的个数可以代表当前子集中数组元素是否存在,因此,只需计算出0 - (2^n - 1)中每个数二进制的1个数并是否添加到list容器中,假设n为4,比如 0 (0000),其中1的个数为0,代表空集,是该数组的

子集,1(0001),其中1的个数为1个,只含有数组中下标为3的元素

简单证明数组集合的子集个数为2^n(使用数学中的归纳法):

如果数组个数为0,其子集个数为1(只含有空集)

如果数组个数为1,其子集个数为2,也就是空集 + 空集加上数组那一个元素

如果数组个数为2,其子集个数为4,也就是一个元素的子集 + 一个元素子集加上数组后面的元素

因此数组集合子集个数为2^n(严格的数学归纳法就不写了)

三、算法实现

思路二:

思路三:

四、简单总结

如若碰到总计数可以往二进制位0-1考虑,是否可以通过位值来表示总数,并考虑二进制位值与所给条件是否相关

思路: 对于某个集合元素 e 和某个子集subset, e要不就在这个集合中,要不就不在。 故,只需枚举所有元素的在或不在某子集, 即可枚举所有子集。

不标准伪代码: 不妨设集合元素为 e[0] 到 e[n-1] 共n个, 用数组 flag[0] 到 flag[n-1] 代表i元素是否在当前集合

void Output( i )

{

if ( i == 集合元素个数n)

{

根据flag数组输出当前集合(在或不在);

return;

}

flag[i] = 在当前集合;

Output(i + 1);

flag[i] = 不在当前集合;

Output(i + 1);

}

初始化时 flag[0] 到flag[n-1]都为 ‘不在当前集合’;

初始调用 Output(0);

以上就是关于c语言求一个整数集合的各个子集的数字和并比较大小,列出和最大的子集全部的内容,包括:c语言求一个整数集合的各个子集的数字和并比较大小,列出和最大的子集、java:两个数组,一个数组是另一个数组的子集,如何取补集比如大数组4,5,6,子集数组5,6,如何取4、数组-leetcode78:Subsets等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9503907.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存