最近在学习《数据结构与算法分析》C语言时,第二章内容中出现了几个比较新颖的算法,这里记录一下。
1.
a.求最小子序列和:
//思路是,逐步计算,如果ThisSum 是正数,
//则ThisSum对于后面的数而言是累赘,舍去
int MinSubsequenceSum(vector<int>& V)
{
int length = V.size();
int MinSum = V[0];
int ThisSum = 0;
for(int i = 0; i < length; i++)
{
ThisSum += V[i];
if(ThisSum < MinSum)
MinSum = ThisSum;
else if(ThisSum > 0)
ThisSum = 0;
}
return MinSum;
}
b.求最小的正子序列和
int MinSubsequenceSum(vector<int>& V)
{
int length = V.size();
int MinSum = V[0];
int ThisSum = 0;
for(int i = 0; i < length; i++)
{
if(V[i] > 0)
{
ThisSum += V[i];
if(ThisSum < MinSum)
MinSum = ThisSum;
else if(ThisSum > 0)
ThisSum = 0;
}
else
{
ThisSum = 0;
}
}
return MinSum;
}
c.求最大子序列乘积
int MaxSubsequence(vector<int>& V)
{
int length = V.size();
//考虑负数情况,需分别存储最大值 最小值
int Tmax = 1,Tmin = 1;
int result = INT_MIN;
for(int i = 0; i < length; i++)
{
//当系数为负数时,最小值乘以该系数会是最大值(需要该系数比较,因为存在-1~1的可能(当然本题限定了整数))
if(V[i] < 0)
swap(Tmax,Tmin);
Tmax = max(Tmax*V[i], V[i]);
Tmin = min(Tmin*V[i], V[i]);
result = max(result,Tmax);
}
return result;
}