📅  最后修改于: 2023-12-03 15:10:34.728000             🧑  作者: Mango
在给定的整数数组中,找到连续子数组,使得该子数组中元素的乘积最大,返回该最大值。
本题可以考虑动态规划算法。既然是乘积最大,那么我们需要考虑负负得正的情况。因此,在状态转移方程中,我们需要同时维护当前数组的最大值和最小值,同时计算当前元素与上一次最大和最小值的乘积。
具体来说,我们维护两个数组,一个用来存储当前的最大乘积,一个用来存储当前的最小乘积。在遍历数组时,每当遇到一个新的元素,我们都分别考虑将其放到已有的最大子数组乘积中或者重新一个新的子数组开始。另外,我们还需要考虑当前元素为负数的情况,即会导致最大数变最小数,最小数变最大数。
具体的状态转移方程为:
max_product = max(max_product * nums[i], min_product * nums[i], nums[i]);
min_product = min(temp_max * nums[i], min_product * nums[i], nums[i]);
其中 max_product
表示当前的最大乘积,min_product
表示当前的最小乘积。
以下是完整的 C++ 代码实现:
class Solution {
public:
int maxProduct(vector<int>& nums) {
int max_product = nums[0], min_product = nums[0], result = nums[0];
for (int i = 1; i < nums.size(); i++) {
int temp_max = max_product;
max_product = max(max_product * nums[i], min_product * nums[i]);
max_product = max(max_product, nums[i]);
min_product = min(temp_max * nums[i], min_product * nums[i]);
min_product = min(min_product, nums[i]);
result = max(result, max_product);
}
return result;
}
};
时间复杂度:$O(n)$,其中 $n$ 表示数组长度,遍历数组一遍即可。
空间复杂度:$O(1)$,我们只需要常数个变量来存储中间结果,因此空间复杂度为常数级别。