题解 | #连续子数组的最大乘积#
连续子数组的最大乘积
https://www.nowcoder.com/practice/fd8c819c07c9493887bfac8549c119f4
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int len = sc.nextInt(); int[] arr = new int[len]; for(int i = 0; i < len; i++) { arr[i] = sc.nextInt(); } int[] dpMax = new int[len]; int[] dpMin = new int[len]; dpMax[0] = arr[0]; dpMin[0] = arr[0]; int max = arr[0]; for(int i = 1; i < len; i++) { //因为负数存在,所以最大乘积可能是上一个最小乘积乘以当前的负数,应该要维护一个连续子数组的最小乘积 dpMax[i] = Math.max(dpMax[i - 1] * arr[i], Math.max(dpMin[i - 1] * arr[i], arr[i])); dpMin[i] = Math.min(dpMin[i - 1] * arr[i], Math.min(dpMax[i - 1] * arr[i], arr[i])); max = Math.max(dpMax[i], max); } System.out.println(max); } }