自学内容网 自学内容网

力扣--动态规划152.乘积最大子数组

思路分析:

  1. 使用动态规划,定义一个二维数组dp,其中dp[i][0]表示以第i个元素结尾的乘积最大子数组的乘积,dp[i][1]表示以第i个元素结尾的乘积最小子数组的乘积。
  2. 初始化dp数组的第一个元素为数组的第一个元素。
  3. 遍历数组,更新dp数组的值,分别计算以当前元素结尾的乘积最大和最小子数组的乘积。
  4. 初始化结果为负无穷,然后遍历dp数组的第一列,找出乘积最大的值。
  5. 返回乘积最大子数组的乘积作为结果。
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)!