子串是连续的,子序列是不连续的。最大子串和用递归:F[i]=max(F[i-1]+a[i],F[i]}。最大子串乘积:维护最大和最小值。
最小的子串和的绝对值:例如-1 【-6 5 1】 3 2 -3,是0。这个问题怎么求呢?
首先维护一个sum数组,sum[i]=a[0]+a[1]+...+a[i],然后就是求某两个|sum[j]-sum[i]|的最小值。
再把sum数组排序,结果为min{|sum[i|-sum|i+1|}。
下面的程序中的list.pos用于维护下标,可以不要。
public class Test
{
public int ABSsum(int a[])
{
int n=a.length;
if(n==0)
return 0;
if(n==1)
return a[0];
int i;
int[] sum=new int[n];
sum[0]=a[0];
unit[] list=new unit[n];
for(i=1;i<n;i++)
{
sum[i]=sum[i-1]+a[i];
list[i]=new unit(sum,i);
}
Comparator<unit> com=new Comparator<unit>()
{
public int compare(unit u1,unit u2)
{
return u1.sum-u2.sum;
}
}
Collections.sort(list,com);
int rst=Math.abs(list[0].sum-list[1].sum);
int temp;
for(i=1;i<n-1;i++)
{
temp=Math.abs(list[i].sum-list[i+1].sum);
if(temp<rst)
rst=temp;
}
return rst;
}
}
class unit
{
int sum;
int pos;
public unit(int s, int p)
{
sum=s;
pos=p;
}
}