力扣 乘积最大子数组

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

动态规划题还是要多练。

相关推荐
♡喜欢做梦2 分钟前
MyBatis操作数据库(进阶):动态SQL
java·数据库·sql·java-ee·mybatis
Bear on Toilet2 分钟前
12 . 二叉树的直径
数据结构·算法·二叉树
惜.己4 分钟前
数据结构与算法-数组异或操作
数据结构·算法
lusasky5 分钟前
com.itextpdf堆外内存(Off-Heap Memory)泄露
java
.豆鲨包5 分钟前
【Android】深入理解Window和WindowManager
android·java
Dylan的码园6 分钟前
ArrayList与顺序表
java·数据结构·链表
Boop_wu6 分钟前
[Java EE] 文件操作(系统文件和字节流字符流)
java·java-ee
Aevget6 分钟前
「Java EE开发指南」如何在MyEclipse中开发EJB 2 Session Bean?(二)
java·ide·java-ee·开发工具·myeclipse
带刺的坐椅6 分钟前
Solon AI 开发学习11 - chat - 工具调用与定制(Tool Call)
java·ai·llm·solon
2301_807997387 分钟前
代码随想录-day55
数据结构·c++·算法