本文共 1596 字,大约阅读时间需要 5 分钟。
为了解决这个问题,我们需要找到数组中乘积最大的连续子数组。这个问题可以通过动态规划的方法来解决,具体步骤如下:
max_so_far
和 min_so_far
,分别表示到当前位置为止的最大乘积和最小乘积。max_so_far
和min_so_far
: max_so_far
和 min_so_far
分别乘以当前元素。max_so_far
和 min_so_far
分别乘以当前元素,并交换它们的位置。max_so_far
保持不变,而 min_so_far
设为零。public class Solution { public int maxProduct(int[] nums) { if (nums.length == 0) return 0; int max_so_far = nums[0]; int min_so_far = nums[0]; int global_max = max_so_far; for (int i = 1; i < nums.length; i++) { int current = nums[i]; int max_current, min_current; if (current > 0) { max_current = max_so_far * current; min_current = min_so_far * current; } else if (current < 0) { max_current = min_so_far * current; min_current = max_so_far * current; } else { max_current = max_so_far; min_current = min_so_far; } max_so_far = Math.max(max_current, current); min_so_far = Math.min(min_current, current); global_max = Math.max(global_max, max_so_far); } return global_max; }}
max_so_far
和min_so_far
为数组的第一个元素,并将global_max
设为max_so_far
。max_current
和min_current
。max_so_far
和min_so_far
,并在每一步更新全局最大乘积global_max
。这种方法的时间复杂度是O(n),其中n是数组的长度,空间复杂度是O(1),非常高效。
转载地址:http://pawa.baihongyu.com/