88、动态规划-乘积最大子数组

思路:

首先使用递归来解,从0开始到N,每次都从index开始到N的求出最大值。然后再次递归index+1到N的最大值,再求max。代码如下:

java 复制代码
  // 方法一:使用递归方式找出最大乘积
    public static int maxProduct(int[] nums) {
        // 检查输入的数组是否为空
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int N = nums.length;
        // 从数组的第一个元素开始递归处理
        return process(nums, 0, N);
    }

    // 辅助递归函数
    private static int process(int[] nums, int index, int N) {
        // 递归的终止条件:当处理到数组的最后一个元素时,返回该元素
        if (index == N - 1) {
            return nums[index];
        }
        int max = nums[index]; // 当前位置的最大乘积初始化为当前元素
        int cur = nums[index]; // 当前乘积
        // 计算从index开始所有可能的子数组乘积
        for (int i = index + 1; i < N; i++) {
            cur = cur * nums[i];
            max = Math.max(max, cur);
        }
        // 返回当前计算的最大值与递归调用下一个元素的结果的最大值
        return Math.max(max, process(nums, index + 1, N));
    }

第二种方法:

使用动态规划

java 复制代码
public static int maxProduct(int[] nums) {
        // 检查输入数组是否为空
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int N = nums.length;
        int[] dp = new int[N + 1]; // 创建DP数组
        dp[N] = Integer.MIN_VALUE; // 初始化边界条件
        dp[N - 1] = nums[N - 1]; // 最后一个元素的最大乘积是其自身
        // 从后向前遍历数组
        for (int index = N - 1; index >= 0; index--) {
            int cur = nums[index];
            dp[index] = Math.max(cur, dp[index + 1]);
            for (int i = index + 1; i < N; i++) {
                cur = cur * nums[i];
                dp[index] = Math.max(dp[index], cur);
            }
        }
        return dp[0]; // 返回整个数组的最大子数组乘积
    }

第三种方法 一次for循环,代码如下:

java 复制代码
    // 方法三:优化的动态规划解法(一次遍历)
    public static int maxProduct(int[] nums) {
        // 检查数组是否为空
        if (nums == null || nums.length == 0) {
            return 0;
        }

        int max = nums[0], min = nums[0], result = nums[0]; // 初始化最大值、最小值和结果

        // 遍历数组元素
        for (int i = 1; i < nums.length; i++) {
            // 如果当前数是负数,交换最大值和最小值
            if (nums[i] < 0) {
                int temp = max;
                max = min;
                min = temp;
            }

            // 更新到当前位置的最大值和最小值
            max = Math.max(nums[i], max * nums[i]);
            min = Math.min(nums[i], min * nums[i]);

            // 更新全局最大乘积结果
            result = Math.max(result, max);
        }

        return result; // 返回结果
    }
相关推荐
C++ 老炮儿的技术栈1 小时前
手动实现strcpy
c语言·开发语言·c++·算法·visual studio
倔强的石头_2 小时前
【数据结构与算法】利用堆结构高效解决TopK问题
后端·算法
倔强的石头_2 小时前
【数据结构与算法】详解二叉树下:实践篇————通过链式结构深入理解并实现二叉树
后端·算法
哎写bug的程序员2 小时前
leetcode复盘(1)
算法·leetcode·职场和发展
风靡晚2 小时前
用于汽车毫米波雷达的四维高分辨率点云图像
人工智能·算法·机器学习·计算机视觉·汽车·信息与通信·信号处理
简简单单做算法3 小时前
基于FD-MIMO技术的雷达通信一体化系统波形设计matlab模拟与仿真
算法
遥不可及3873 小时前
动态规划(DP)从入门到精通:原理详解与经典问题解析
java·算法
小马敲马3 小时前
[3.4] 集合通信 理论+代码
开发语言·c++·人工智能·算法·性能优化
麦兜*3 小时前
【为什么InnoDB用B+树?从存储结构到索引设计深度解析】
java·数据结构·spring boot·b树·mysql·算法·数据库架构
lboverfys3 小时前
动态规划之爬楼梯(二)
算法·动态规划