Skip to content

Commit 0c7e04b

Browse files
committed
max sub sum
1 parent caf98ab commit 0c7e04b

File tree

1 file changed

+61
-54
lines changed

1 file changed

+61
-54
lines changed

13-《进阶》单调栈和窗口.md

Lines changed: 61 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -419,74 +419,81 @@ func main() {
419419

420420
给定一个只包含正整数的数组arr,arr中任何一个子数组sub,一定都可以算出(sub累加和)*(sub中的最小值)是什么,那么所有子数组中,这个值最大是多少?
421421

422-
```Java
423-
424-
package class01;
425-
426-
import java.util.Stack;
422+
```Go
423+
package main
427424

428-
public class Code04_AllTimesMinToMax {
425+
import (
426+
"fmt"
427+
"math"
428+
)
429429

430-
public static int max1(int[] arr) {
431-
int max = Integer.MIN_VALUE;
432-
for (int i = 0; i < arr.length; i++) {
433-
for (int j = i; j < arr.length; j++) {
434-
int minNum = Integer.MAX_VALUE;
435-
int sum = 0;
436-
for (int k = i; k <= j; k++) {
437-
sum += arr[k];
438-
minNum = Math.min(minNum, arr[k]);
439-
}
440-
max = Math.max(max, minNum * sum);
430+
// 给定一个正整数数组,求子数组中,累加和乘以数组中最小值。所有子数组中算出的最大值返回
431+
func max1(arr []int) int {
432+
max := math.MinInt
433+
for i := 0; i < len(arr); i++ {
434+
for j := i; j < len(arr); j++ {
435+
minNum := math.MaxInt
436+
sum := 0
437+
for k := i; k <= j; k++ {
438+
sum += arr[k]
439+
minNum = int(math.Min(float64(minNum), float64(arr[k])))
441440
}
441+
max = int(math.Max(float64(max), float64(minNum * sum)))
442442
}
443-
return max;
444443
}
444+
return max
445+
}
445446

446-
public static int max2(int[] arr) {
447-
int size = arr.length;
448-
int[] sums = new int[size];
449-
sums[0] = arr[0];
450-
for (int i = 1; i < size; i++) {
451-
sums[i] = sums[i - 1] + arr[i];
452-
}
453-
int max = Integer.MIN_VALUE;
454-
Stack<Integer> stack = new Stack<Integer>();
455-
for (int i = 0; i < size; i++) {
456-
while (!stack.isEmpty() && arr[stack.peek()] >= arr[i]) {
457-
int j = stack.pop();
458-
max = Math.max(max, (stack.isEmpty() ? sums[i - 1] : (sums[i - 1] - sums[stack.peek()])) * arr[j]);
459-
}
460-
stack.push(i);
461-
}
462-
while (!stack.isEmpty()) {
463-
int j = stack.pop();
464-
max = Math.max(max, (stack.isEmpty() ? sums[size - 1] : (sums[size - 1] - sums[stack.peek()])) * arr[j]);
465-
}
466-
return max;
447+
func max2(arr []int) int {
448+
size := len(arr)
449+
sums := make([]int, size)
450+
451+
sums[0] = arr[0]
452+
for i := 1; i < size; i++ {
453+
sums[i] = sums[i - 1] + arr[i]
467454
}
468455

469-
public static int[] gerenareRondomArray() {
470-
int[] arr = new int[(int) (Math.random() * 20) + 10];
471-
for (int i = 0; i < arr.length; i++) {
472-
arr[i] = (int) (Math.random() * 101);
456+
max := math.MinInt
457+
stack := make([]int, 0)
458+
459+
for i := 0; i < size; i++ {
460+
for len(stack) != 0 && arr[stack[len(stack) - 1]] >= arr[i] {
461+
// stack pop
462+
j := stack[len(stack) - 1]
463+
stack = stack[:len(stack) - 1]
464+
465+
m := math.MinInt
466+
if len(stack) == 0 {
467+
m = sums[i - 1]
468+
} else {
469+
m = sums[i - 1] - sums[stack[len(stack) - 1]]
470+
}
471+
472+
max = int(math.Max(float64(max), float64(m * arr[j])))
473473
}
474-
return arr;
474+
stack = append(stack, i)
475475
}
476476

477-
public static void main(String[] args) {
478-
int testTimes = 2000000;
479-
System.out.println("test begin");
480-
for (int i = 0; i < testTimes; i++) {
481-
int[] arr = gerenareRondomArray();
482-
if (max1(arr) != max2(arr)) {
483-
System.out.println("FUCK!");
484-
break;
485-
}
477+
for len(stack) != 0 {
478+
j := stack[len(stack) - 1]
479+
stack = stack[:len(stack) - 1]
480+
481+
m := math.MinInt
482+
if len(stack) == 0 {
483+
m = sums[size - 1]
484+
} else {
485+
m = sums[size - 1] - sums[stack[len(stack) - 1]]
486486
}
487-
System.out.println("test finish");
487+
488+
max = int(math.Max(float64(max), float64(m * arr[j])))
488489
}
489490

491+
return max
490492
}
491493

494+
func main() {
495+
arr := []int{3, 4, 1, 7, 3, 9, 12, 62, 82, 91, 30}
496+
fmt.Println(max1(arr))
497+
fmt.Println(max2(arr))
498+
}
492499
```

0 commit comments

Comments
 (0)