问题
给定一个double类型的数组arr, 其中的元素可正, 可负, 可0, 返回子数组累乘的最大乘积.
例如, arr = [-2.5, 4, 0, 3, 0.5, 8, -1], 子数组{3, 0.5, 8}累乘可以获得最大的乘积12, 所以返回12.
分析
最大累乘积, 就是在以每个元素arr[i], 0=<i<= size-1 为结尾的子数组的最大累乘积中, 最大的值.
以arr[i]为结尾的累乘积由三种情况, 从这三种情况中选择最大的作为当前最大累乘积:
- curMax * arr[i], curMax为以arr[i-1]为结尾的最大累乘积. 如数组[1, 2, 3, 4], 当i = 3时, curMax = 1 * 2 * 3 = 6. curMax * arr[3] = 24
- curMin * arr[i], curMin为以arr[i-1]为结尾的最小累乘积, 考虑到的情况是curMin为负数, 并且arr[i]也为负数的场景. 如数组[1,2,-3,-4], 当i = 3时, curMin = 1 * 2 * -3 = -6, curMin * arr[i] = -6 * -4 = 24
- arr[i], 最大累乘积是arr[i]自身, 如数组[1, 2, -3], 以-3结尾的最大累乘积为 -3
class Solution
{
public:
double maxMulti(std::vector<double>& nums)
{
if (nums.size() == 0)
{
return 0;
}
double curMax = nums[0];
double curMin = nums[0];
double result = nums[0];
for (std::vector<double>::iterator cur = nums.begin() + 1; cur < nums.end(); ++cur)
{
double cand1 = curMax * *cur;
double cand2 = curMin * *cur;
double cand3 = *cur;
curMax = std::max(cand1, std::max(cand2, cand3));
curMin = std::min(cand1, std::min(cand2, cand3));
result = std::max(curMax, result);
}
return result;
}
};
int main()
{
Solution solution;
std::vector<double> nums = {-2.5, 4, 0, 3, 0.5, 8, -1};
std::cout << solution.maxMulti(nums) << std::endl;
}