🔗 leetcode.cn/problems/ma…
题目
- 给一个整数组成的数组 nums,有正有负
- 返回乘积最大的非空连续子数组的乘积值
思路
- dp,乘积有正有负,需要都记录下来,乘积最大的 maxdp 和 乘积最小的 mindp
- maxdp[i] = max(maxdp[i-1] * nums[i], mindp[i-1]* nums[i], nums[i])
- mindp[i] = min(maxdp[i-1] * nums[i], mindp[i-1]* nums[i], nums[i])
- 记录这个过程的最大乘积
代码
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size()
vector<int> maxdp(n), mindp(n)
maxdp[0] = nums[0]
mindp[0] = nums[0]
int ans = max(maxdp[0], maxdp[0])
for (int i = 1
maxdp[i] = max(nums[i], maxdp[i-1] * nums[i])
maxdp[i] = max(maxdp[i], mindp[i-1]* nums[i])
mindp[i] = min(nums[i], mindp[i-1] * nums[i])
mindp[i] = min(mindp[i], maxdp[i-1] * nums[i])
ans = max(ans, mindp[i])
ans = max(maxdp[i], ans)
}
return ans
}
}