力扣 乘积最大子数组

动态规划,注意负负得正,dp交换。

题目

注意这里的dp的乘积要求最大,而两个很大的负数相乘也是大的,因此在每遍历到一个数时要存一个最大值的dp与一个最小值的dp,然后遍历完后再去存ans的dp。由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此还需要维护当前最小值。

时间复杂度: O(n),空间复杂度: O(1)。

java 复制代码
class Solution {
    public int maxProduct(int[] nums) {
        int ans = Integer.MIN_VALUE, imax = 1, imin = 1;
        for(int i=0; i<nums.length; i++){
            if(nums[i] < 0){ 
         // 负数交换,这样每次循环后,imax最大,imin最小
              int tmp = imax;
              imax = imin;
              imin = tmp;
            }
            imax = Math.max(imax*nums[i], nums[i]);//维护大的

            imin = Math.min(imin*nums[i], nums[i]);//维护小的
            
            ans = Math.max(ans, imax);
        }
        return ans;
    }
}

动态规划题还是要多练。

相关推荐
renhongxia110 分钟前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了11 分钟前
数据结构之树(Java实现)
java·算法
算法备案代理13 分钟前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
Monly2114 分钟前
Java:修改打包配置文件
java·开发语言
roman_日积跬步-终至千里14 分钟前
【架构设计与实现】动态数据源切换:核心代码实现手册
java
XiaoFan01223 分钟前
免密批量抓取日志并集中输出
java·linux·服务器
顾北1229 分钟前
MCP服务端开发:图片搜索助力旅游计划
java·spring boot·dubbo
我命由我1234536 分钟前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
赛姐在努力.37 分钟前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
yxc_inspire41 分钟前
Java学习第二天
java·面向对象