diff --git a/src/class25/Code02_AllTimesMinToMax.java b/src/class25/Code02_AllTimesMinToMax.java index e574b8b..2f26ac1 100644 --- a/src/class25/Code02_AllTimesMinToMax.java +++ b/src/class25/Code02_AllTimesMinToMax.java @@ -67,7 +67,8 @@ public class Code02_AllTimesMinToMax { // 本题可以在leetcode上找到原题 // 测试链接 : https://leetcode.com/problems/maximum-subarray-min-product/ // 注意测试题目数量大,要取模,但是思路和课上讲的是完全一样的 - // 注意溢出的处理即可 + // 注意溢出的处理即可,也就是用long类型来表示累加和 + // 还有优化就是,你可以用自己手写的数组栈,来替代系统实现的栈,也会快很多 public static int maxSumMinProduct(int[] arr) { int size = arr.length; long[] sums = new long[size]; @@ -76,17 +77,20 @@ public class Code02_AllTimesMinToMax { sums[i] = sums[i - 1] + arr[i]; } long max = Long.MIN_VALUE; - Stack stack = new Stack(); + int[] stack = new int[size]; + int stackSize = 0; for (int i = 0; i < size; i++) { - while (!stack.isEmpty() && arr[stack.peek()] >= arr[i]) { - int j = stack.pop(); - max = Math.max(max, (stack.isEmpty() ? sums[i - 1] : (sums[i - 1] - sums[stack.peek()])) * arr[j]); + while (stackSize != 0 && arr[stack[stackSize - 1]] >= arr[i]) { + int j = stack[--stackSize]; + max = Math.max(max, + (stackSize == 0 ? sums[i - 1] : (sums[i - 1] - sums[stack[stackSize - 1]])) * arr[j]); } - stack.push(i); + stack[stackSize++] = i; } - while (!stack.isEmpty()) { - int j = stack.pop(); - max = Math.max(max, (stack.isEmpty() ? sums[size - 1] : (sums[size - 1] - sums[stack.peek()])) * arr[j]); + while (stackSize != 0) { + int j = stack[--stackSize]; + max = Math.max(max, + (stackSize == 0 ? sums[size - 1] : (sums[size - 1] - sums[stack[stackSize - 1]])) * arr[j]); } return (int) (max % 1000000007); }