力扣 乘积最大子数组

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

动态规划题还是要多练。

相关推荐
喝可乐的希饭a6 分钟前
Spring 策略模式实现
java·spring·策略模式
技术卷8 分钟前
详解力扣高频SQL50题之550. 游戏玩法分析 IV【中等】
sql·mysql·leetcode·oracle
荒诞硬汉10 分钟前
二维数组相关学习
java·算法
我有一只肥螳螂21 分钟前
idea监控本地堆栈
java·ide·intellij-idea
周末程序猿25 分钟前
技术总结|如何使用提升 strlen 的性能?
后端·算法
菜鸟5555528 分钟前
图论:Dijkstra算法
算法·图论·dijkstra·xcpc
程序员良辰39 分钟前
URL与URI:互联网世界的“门牌号“与“身份证“
java·网络协议
ahauedu1 小时前
Apache POI 依赖版本冲突导致 NoSuchFieldError: Factory 报错
java·maven·apache
科大饭桶1 小时前
数据结构自学Day15 -- 非比较排序--计数排序
数据结构·算法·leetcode·排序算法·c
剪一朵云爱着1 小时前
力扣二叉树的前序中序后序遍历总结
算法·leetcode·二叉树