力扣 乘积最大子数组

动态规划,注意负负得正,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;
    }
}

动态规划题还是要多练。

相关推荐
Xの哲學6 分钟前
Perf使用详解
linux·网络·网络协议·算法·架构
2301_7930868711 分钟前
SpringCloud 02 服务治理 Nacos
java·spring boot·spring cloud
想不明白的过度思考者16 分钟前
数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
数据结构·算法·排序算法
回家路上绕了弯18 分钟前
MySQL 详细使用指南:从入门到精通
java·mysql
小七rrrrr22 分钟前
动态规划法 - 53. 最大子数组和
java·算法·动态规划
code小毛孩27 分钟前
leetcodehot100 矩阵置零
算法
自由的疯30 分钟前
在 Java IDEA 中使用 DeepSeek 详解
java·后端·架构
何妨重温wdys36 分钟前
矩阵链相乘的最少乘法次数(动态规划解法)
c++·算法·矩阵·动态规划
自由的疯36 分钟前
Java 通过接口方式使用 DeepSeek 详解
java·后端·trae