这是个经典算法:
#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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)