怎么算法版如此冷清?加温.REF:两个算法题,请教各位高手!
中间件XL 2007-01-20 11:56:53 本贴引自C/C++版 http://community.csdn.net/Expert/TopicView3.asp?id=5304123
其中第二题:
2.有一串数字,比如说:1,7,-5,9,13,-1,8,...,77 问,怎么设计一个比较好的算法,可以快速得到这串数字中最大的数字串,要求数字串必须是连续的!
本人觉得很有取,也有难度.我只用java,因此搬到这里比较合适.
以下是本人的拙解,欢迎各路英雄切磋,共同学习.
/*
第二题
原理:
设数字串a[]
设数组s[][],其中s[i][j]表示以i为起点,j个元素长的数字串。
则所有连续字符串为一上三角矩阵
s[1][1],s[1][2],...,s[1][n-1],s[1][n]
s[2][1],s[2][2],...,s[2][n-1]
...
s[i][1],s[i][2],...,s[i][n-i+1]
...
s[n][1].
n为数组个数
以下拿任一小三角型研究
(i,j) . . (i,j+1)
(i+1,j) .
3元素如下:
s[i][j],s[i][j+1]
s[i+1][j]
其中:
s[i][j+1]=s[i][j]+a[i+j+1]
s[i+1][j]=s[i][j]-a[i]+a[i][i+j+1]
得: s[i][j+1]=s[i+1][j]+a[i]
即: 小三角型斜线相邻两点相差a[i]
算法:
for each col{
以s[i][col]为起点计算斜线每个点
比较该点的值和当前最大值
}
参考代码: java
*/
class test{
public static void main(String args[]){
int a[]=new int[]{0,-1,6,-5,9,13,-1,8,-6}; // 第一个丢弃,只为与原理分析表示一致
int max=a[1]; // 最大值
int s=0;
int I=1,J=1;
int tmp,tmps;
for(int j=1;j<a.length;j++){
s=s+a[j]; // s[i][j] 斜线起点
max=(s>max) ? s:max;
if (max==s){
I=1;J=j;
}
tmps=s;
for(int i=1;i<=j-1;i++){
tmp=s-a[i]; // s[i+1][j]=s[i][j+1]-a[i]
max=(tmp>max) ? tmp:max;
if (max==tmp){
I=i+1;J=j;
}
s=tmp;
} // end for i
s=tmps;
} // end for j
System.out.println(I+","+J);
System.out.print(max);
}
}