力扣 乘积最大子数组

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

动态规划题还是要多练。

相关推荐
Hali_Botebie11 分钟前
两种子词分词算法BPE (Byte-Pair Encoding) 和Unigram 区别
人工智能·算法
he___H16 分钟前
leetcode100-普通数组
java·数据结构·算法·leetcode
y = xⁿ18 分钟前
JUC:锁机制/关键字
java·开发语言
Struggle_975525 分钟前
算法知识-堆相关知识
java·开发语言·算法
李伟_Li慢慢32 分钟前
从惯性和矩详解惯性矩
人工智能·算法·机器人
黎阳之光32 分钟前
实景三维重构赋能智慧仓储,黎阳之光打造仓库全域透明管控新生态
大数据·人工智能·算法·安全·数字孪生
vigor51236 分钟前
异步服务的调用处理
算法
wuweijianlove37 分钟前
算法的渐进复杂度与现实执行性能差异研究的技术6
算法
黎阳之光42 分钟前
黎阳之光:以原创硬核通信,定义无人系统与应急指挥新边界|7030‑46无线图数自组网电台技术解析
大数据·人工智能·物联网·算法·数字孪生
小许同学记录成长42 分钟前
gr-filter 滤波与多速率模块完整源码分析
算法·信号处理