modify code

master
algorithmzuo 4 years ago
parent ef85606ca3
commit d4b74ebe12

@ -1,11 +1,10 @@
package class26; package class26;
import java.util.Stack;
// 测试链接https://leetcode.com/problems/sum-of-subarray-minimums/ // 测试链接https://leetcode.com/problems/sum-of-subarray-minimums/
// subArrayMinSum1是暴力解 // subArrayMinSum1是暴力解
// subArrayMinSum2是最优解的思路 // subArrayMinSum2是最优解的思路
// sumSubarrayMins是最优解思路下的单调栈优化 // sumSubarrayMins是最优解思路下的单调栈优化
// Leetcode上不要提交subArrayMinSum1、subArrayMinSum2方法因为没有考虑取摸
// Leetcode上只提交sumSubarrayMins方法时间复杂度O(N),可以直接通过 // Leetcode上只提交sumSubarrayMins方法时间复杂度O(N),可以直接通过
public class Code01_SumOfSubarrayMinimums { public class Code01_SumOfSubarrayMinimums {
@ -71,8 +70,9 @@ public class Code01_SumOfSubarrayMinimums {
} }
public static int sumSubarrayMins(int[] arr) { public static int sumSubarrayMins(int[] arr) {
int[] left = nearLessEqualLeft(arr); int[] stack = new int[arr.length];
int[] right = nearLessRight(arr); int[] left = nearLessEqualLeft(arr, stack);
int[] right = nearLessRight(arr, stack);
long ans = 0; long ans = 0;
for (int i = 0; i < arr.length; i++) { for (int i = 0; i < arr.length; i++) {
long start = i - left[i]; long start = i - left[i];
@ -83,34 +83,34 @@ public class Code01_SumOfSubarrayMinimums {
return (int) ans; return (int) ans;
} }
public static int[] nearLessEqualLeft(int[] arr) { public static int[] nearLessEqualLeft(int[] arr, int[] stack) {
int N = arr.length; int N = arr.length;
int[] left = new int[N]; int[] left = new int[N];
Stack<Integer> stack = new Stack<>(); int size = 0;
for (int i = N - 1; i >= 0; i--) { for (int i = N - 1; i >= 0; i--) {
while (!stack.isEmpty() && arr[i] <= arr[stack.peek()]) { while (size != 0 && arr[i] <= arr[stack[size - 1]]) {
left[stack.pop()] = i; left[stack[--size]] = i;
} }
stack.push(i); stack[size++] = i;
} }
while (!stack.isEmpty()) { while (size != 0) {
left[stack.pop()] = -1; left[stack[--size]] = -1;
} }
return left; return left;
} }
public static int[] nearLessRight(int[] arr) { public static int[] nearLessRight(int[] arr, int[] stack) {
int N = arr.length; int N = arr.length;
int[] right = new int[N]; int[] right = new int[N];
Stack<Integer> stack = new Stack<>(); int size = 0;
for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) {
while (!stack.isEmpty() && arr[stack.peek()] > arr[i]) { while (size != 0 && arr[stack[size - 1]] > arr[i]) {
right[stack.pop()] = i; right[stack[--size]] = i;
} }
stack.push(i); stack[size++] = i;
} }
while (!stack.isEmpty()) { while (size != 0) {
right[stack.pop()] = N; right[stack[--size]] = N;
} }
return right; return right;
} }

Loading…
Cancel
Save