力扣--动态规划152.乘积最大子数组
思路分析:
- 使用动态规划,定义一个二维数组dp,其中dp[i][0]表示以第i个元素结尾的乘积最大子数组的乘积,dp[i][1]表示以第i个元素结尾的乘积最小子数组的乘积。
- 初始化dp数组的第一个元素为数组的第一个元素。
- 遍历数组,更新dp数组的值,分别计算以当前元素结尾的乘积最大和最小子数组的乘积。
- 初始化结果为负无穷,然后遍历dp数组的第一列,找出乘积最大的值。
- 返回乘积最大子数组的乘积作为结果。
class Solution {
public:
// 函数用于计算数组中乘积最大的子数组
int maxProduct(vector<int>& nums) {
// 获取数组大小
int n = nums.size();
// dp数组,dp[i][0]表示以第i个元素结尾的乘积最大子数组的乘积,
// dp[i][1]表示以第i个元素结尾的乘积最小子数组的乘积
vector<vector<int>> dp(n, vector<int>(2, 0));
// 初始化dp数组的第一个元素
dp[0][0] = dp[0][1] = nums[0];
// 遍历数组,计算dp数组的值
for (int i = 1; i < n; i++) {
// 更新乘积最大子数组
dp[i][0] = max(nums[i], max(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]));
// 更新乘积最小子数组
dp[i][1] = min(nums[i], min(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]));
}
// 初始化结果为负无穷
int result = -INT_MAX;
// 遍历dp数组的第一列,找出乘积最大的值
for (int i = 0; i < n; i++)
result = max(result, dp[i][0]);
// 返回乘积最大子数组的乘积
return result;
}
};
原文地址:https://blog.csdn.net/weixin_73865269/article/details/136480670
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!