@@ -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