zhongshan99(咬过的苹果):
为了解决(- +...+)或(- +...+ - ...-)的情况,应将未尾的
if first >= last then
begin
first := iFeaMax;
last := iFeaMax;
end;
改为->
if first >= last then
begin
first := iFeaMax;
last := iFeaMax;
end
else
begin
//解决(- +...+)或(- +...+ - ...-)的情况
if (first = low(X)) and (X[first] < 0) then first := low(X) + 1;
end;
zhongshan99(咬过的苹果):对不起,我没有考虑到全是正整数的情况。
修改过的程序附在后面。
另,返回的first是0,就表示是序列的第一个元素;是1,第二个元素。
程序的主要思路是:
从序列的两端进行最大和序列的查找;初始化前序列和FSum为0,后序列和LSum为0
###如果FSum < LSum, 则从前端查找确定序列的第一个元素;否则从后端查找确定序列的最后一个元素;
从前端查找时,
如果FSum < 0, 则丢弃已查找的序列,FSum = 0,First 为下个元素,继续查找;
如果元素为负and不是本次循环的第一次and不是FSum < 0后查找的第一次,则下次查找的元素FNext还是本次查找的元素,Reset FSum, 返回###比较Fsum, LSum
从后端查找相似。
procedure GetMaxSerial(const X: array of integer;var first, last: integer);
var
i: integer;
FSum, LSum: integer; //用于保存从列头和列尾查找的序列和的最大值
FNext, LNext: integer; // 列头和列尾下一个要查找的元素
FeaMax, iFeaMax: integer; //保存最大单个元素及其序号
begin
//最大和序列的第一个和最后一个元素初始化为序列的第一个和最后一个元素
first := low(X); last := high(X);
FNext := low(X); LNext := high(X);
FeaMax := X[low(X)]; iFeaMax := low(X);
FSum := 0; LSum := 0;
while (FNext < LNext) do
begin
if FSum < LSum then
//确定序列的第一个元素
begin
for i := FNext to high(X) do
begin
if X[i] > FeaMax then
begin
FeaMax := X[i];
iFeaMax := i;
end; //保存最大的元素
FSum := FSum + X[i];
if FSum < 0 then
begin
FSum := 0;
First := i + 1;
FNext := i + 1;
Continue;
end;
if (X[i] < 0) and (i <> FNext) then //不是本次循环的第一次且是负数
begin
LSum := LSum - X[i];
FNext := i;
break;
end;
FNext := i + 1;
end; //end of for i
if i > high(X) then FNext := high(X); //已经到达列尾
end
else
//确定序列的最后一个元素
begin
for i := LNext Downto low(X) do
begin
if X[i] > FeaMax then
begin
FeaMax := X[i];
iFeaMax := i;
end; //保存最大的元素
LSum := LSum + X[i];
if LSum < 0 then
begin
LSum := 0;
last := i - 1;
LNext := i - 1;
Continue;
end;
if (X[i] < 0) and (i <> LNext) then //不是本次循环的第一次且是负数
begin
LSum := LSum - X[i];
LNext := i;
break;
end;
end; //end of for i
if i < low(X) then LNext := low(x); //已经到达列首
end; //end of 确定序列的最后一个元素
end; //end of while
if first >= last then
begin
first := iFeaMax;
last := iFeaMax;
end;
end;
zhongshan99(咬过的苹果):如果整个数组都是负数呢,那么答案就应该是最大的那个负数的位置了。这种情况我已经考虑了。
代码最后部分:
if first >= last then
begin
first := iFeaMax; //iFeaMax就是最大整数的位置。
last := iFeaMax;
end;