当前位置: 首页 > article >正文

leetcode152-乘积最大的子数组

152. 乘积最大子数组

已解答

中等

相关标签

相关企业

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续 

子数组

(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

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

示例 1:

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

这道题因为安放在动态规划栏目里面,导致我先入为主直接开始动规四部曲,做完运行也成功,结果提交时候发现问题来了,我的动规就是从头向后找最大值,完全忽略了负数这码事,就导致两个负数的事例运行不了,所以要么重写要么给我再加一个dp数组。

所以我们暂且加一个dp数组,动规四部曲如下:

dp数组定义:一个max一个min,一个存放最大值一个存放最小值

递推公式:当小于0的时候需要最大值最小值交换,所以

                 dpmax[i] = Math.max(nums[i-1],dpmin[i - 1] * nums[i - 1]);
                 dpmin[i] = Math.min(nums[i-1],dpmax[i - 1] * nums[i - 1]);

                大于0的时候:

                dpmax[i] = Math.max(nums[i-1],dpmax[i - 1] * nums[i - 1]);
                dpmin[i] = Math.min(nums[i-1],dpmin[i - 1] * nums[i - 1]);

初始化就要把数组的第一位设成1或者设成nums[0],这里我写的麻烦了一点就是设成了1,

遍历顺序从前向后,从后向前也一样,随个人喜好

上代码:

class Solution {
    public int maxProduct(int[] nums) {
        int n = nums.length;
        int[] dpmax = new int[n + 1];
        int[] dpmin = new int[n + 1];
        dpmax[0] = 1;
        dpmin[0] = 1;
        int res = Integer.MIN_VALUE;
        for (int i = 1; i <= n; i++) {
            if (nums[i-1] <= 0) {
                dpmax[i] = Math.max(nums[i-1],dpmin[i - 1] * nums[i - 1]);
                dpmin[i] = Math.min(nums[i-1],dpmax[i - 1] * nums[i - 1]);
            } else  {
                dpmax[i] = Math.max(nums[i-1],dpmax[i - 1] * nums[i - 1]);
                dpmin[i] = Math.min(nums[i-1],dpmin[i - 1] * nums[i - 1]);
            }
            res = Math.max(res, dpmax[i]);
        }
        return res;
    }

}

 写到这其实可以感受到其实没必要维护两个大数组,两个值其实就搞定了,所以更改一下

class Solution {
    public int maxProduct(int[] nums) {
        int n = nums.length;
        if (n == 0) return 0;

        // 初始化最大值和最小值
        int maxProd = nums[0];
        int minProd = nums[0];
        int result = nums[0];

        for (int i = 1; i < n; i++) {
            // 当前数字
            int num = nums[i];

            // 如果当前数字是负数,最大值和最小值会互换
            if (num < 0) {
                int temp = maxProd;
                maxProd = minProd;
                minProd = temp;
            }

            // 更新最大值和最小值
            maxProd = Math.max(num, maxProd * num);
            minProd = Math.min(num, minProd * num);

            // 更新结果
            result = Math.max(result, maxProd);
        }

        return result;
    }
}


http://www.kler.cn/a/520830.html

相关文章:

  • 【Linux】列出所有连接的 WiFi 网络的密码
  • 深入理解 C 语言函数指针的高级用法:(void (*) (void *)) _IO_funlockfile
  • 代码工艺:实践 Spring Boot TDD 测试驱动开发
  • 用深度学习优化供应链管理:让算法成为商业决策的引擎
  • Transfoemr的解码器(Decoder)与分词技术
  • The just sharing principle: advice for advice givers
  • Forsaken喜欢数论(线性筛)
  • H266/VVC 量化编码中量化矩阵 QM 技术
  • 是否参加26年冬奥会?30岁羽生结弦:没有重返赛场打算
  • 小A的回文串
  • 无耳科技 Solon v3.0.7 发布(2025农历新年版)
  • ChatGPT从数据分析到内容写作建议相关的46个提示词分享!
  • 【S32K3 RTD LLD篇7】K344中心对齐PWM中心点触发ADC BCTU采样
  • 2025MCM美国大学生数学建模竞赛B题-可持续旅游管理思路详解+建模论文+源代码
  • C# 拖入文件 只能拖入txt文件
  • 性能优化案例:通过合理设置spark.default.parallelism参数的值来优化PySpark程序的性能
  • 白嫖一个可以公网访问、带评论和图床的博客系统
  • MySQL的复制
  • 【git】进阶使用,自存档
  • 嵌入式蓝桥杯电子赛嵌入式(第14届国赛真题)总结
  • 笔灵ai写作技术浅析(二):自然语言处理
  • 【开发日记】微信小程序getBackgroundAudioManager播放背景音乐提示播放失败
  • 每日一题-判断是不是二叉搜索树
  • 【Linux】自动化构建-make/Makefile
  • linux naive代理设置
  • 解决.NET程序通过网盘传到Linux和macOS不能运行的问题