乘积最大子数组 - LeetCode 热题 88

大家好!我是曾续缘😆

今天是《LeetCode 热题 100》系列

发车第 88 天

动态规划第 8 题

❤️点赞 👍 收藏 ⭐再看,养成习惯

乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

示例 1:

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

提示:

  • 1 <= nums.length <= 2 * 104
  • -10 <= nums[i] <= 10
  • nums 的任何前缀或后缀的乘积都 保证 是一个 32-位 整数
难度:💖💖

解题方法

在解决这个问题时,我们的目标是找到一个整数数组中的最大乘积非空连续子数组。这里有一个重要的观察点:一个负数乘以另一个负数会得到一个正数,而一个负数乘以一个正数或者一个正数乘以另一个正数,结果都是负数或者正数。因此,当我们寻找最大乘积时,我们应该同时跟踪到当前位置为止的最大乘积和最小乘积,因为最小的负数乘积可能会在下一刻变成最大的正数乘积。

  1. 定义状态: 我们定义一个二维数组 f,其中 f[i][0] 表示以 nums[i] 结尾的子数组的最大乘积,f[i][1] 表示以 nums[i] 结尾的子数组的最小乘积。可以认为f[i][1] 是负数,如果非负,也不影响 f[i][0] 。下面使用 f[i][0] 表示正, f[i][0]表示负。
  2. 初始化状态: 数组的第一位数字,其最大乘积和最小乘积都是它本身,即 f[0][0] = nums[0]f[0][1] = nums[0]
  3. 状态转移方程: 对于数组的每一位数字,我们需要考虑两种情况:
    • 如果当前数字 nums[i] 是正数,那么最大乘积可能是由之前的正乘以当前的正数得到的,也可能是当前数字本身;最小乘积可能是由之前的负乘以当前的正数得到的,也可能是当前数字本身。
    • 如果当前数字 nums[i] 是负数,那么最大乘积可能是由之前的负乘以当前的负数得到的,也可能是当前数字本身;最小乘积可能是由之前的正乘以当前的负数得到的,也可能是当前数字本身。
  4. 更新状态: 根据上述状态转移方程,我们可以更新 f[i][0]f[i][1] 的值。
  5. 找出最终答案: 在整个数组遍历完成后,我们需要找出所有的 f[i][0] 中的最大值,这个值就是最大乘积的子数组乘积。

Code

class Solution {
    public int maxProduct(int[] nums) {
        int n = nums.length;
        int[][] f = new int[n][2];
        f[0][0] = nums[0];
        f[0][1] = nums[0];
        for(int i = 1; i < n; i++){
            if(nums[i] >= 0){
                f[i][0] = Math.max(f[i - 1][0] * nums[i], nums[i]);
                f[i][1] = Math.min(f[i - 1][1] * nums[i], nums[i]);
            }else{
                f[i][0] = Math.max(f[i - 1][1] * nums[i], nums[i]);
                f[i][1] = Math.min(f[i - 1][0] * nums[i], nums[i]);
            }
        }
        int ans = f[0][0];
        for(int i = 1; i < n; i++){
            ans = Math.max(ans, f[i][0]);
        }
        return ans;
    }
}

相关推荐

  1. 乘积数组 - LeetCode 88

    2024-06-09 14:34:05       9 阅读
  2. LeetCode每日一】152. 乘积数组

    2024-06-09 14:34:05       50 阅读
  3. LeetCode-152. 乘积数组

    2024-06-09 14:34:05       49 阅读
  4. leetcode 152.乘积数组

    2024-06-09 14:34:05       30 阅读
  5. leetcode152 乘积数组

    2024-06-09 14:34:05       17 阅读
  6. leetcode152. 乘积数组

    2024-06-09 14:34:05       11 阅读
  7. Leecode100--53:数组之和

    2024-06-09 14:34:05       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 14:34:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 14:34:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 14:34:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 14:34:05       20 阅读

热门阅读

  1. 3.组件间通信-mitt(任意组件间通信)

    2024-06-09 14:34:05       11 阅读
  2. spring boot集成pg

    2024-06-09 14:34:05       9 阅读
  3. !力扣70. 爬楼梯

    2024-06-09 14:34:05       8 阅读
  4. 微信小程序:实现音乐播放器的功能

    2024-06-09 14:34:05       6 阅读
  5. oracle10g的dataguard测试

    2024-06-09 14:34:05       12 阅读
  6. 电商系统中热库和冷库的使用与数据转换

    2024-06-09 14:34:05       8 阅读
  7. Python R用法:深度探索与实用技巧

    2024-06-09 14:34:05       9 阅读
  8. K-means聚类模型

    2024-06-09 14:34:05       10 阅读
  9. RAGFlow 学习笔记

    2024-06-09 14:34:05       10 阅读
  10. tcpdump 抓包

    2024-06-09 14:34:05       9 阅读
  11. TypeScript看这篇就够了

    2024-06-09 14:34:05       12 阅读
  12. 【分享】使用 Reducer 和 Context 拓展你的应用

    2024-06-09 14:34:05       13 阅读