@@ -419,74 +419,81 @@ func main() {
419
419
420
420
给定一个只包含正整数的数组arr,arr中任何一个子数组sub,一定都可以算出(sub累加和)* (sub中的最小值)是什么,那么所有子数组中,这个值最大是多少?
421
421
422
- ``` Java
423
-
424
- package class01 ;
425
-
426
- import java.util.Stack ;
422
+ ``` Go
423
+ package main
427
424
428
- public class Code04_AllTimesMinToMax {
425
+ import (
426
+ " fmt"
427
+ " math"
428
+ )
429
429
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])))
441
440
}
441
+ max = int (math.Max (float64 (max), float64 (minNum * sum)))
442
442
}
443
- return max;
444
443
}
444
+ return max
445
+ }
445
446
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]
467
454
}
468
455
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])))
473
473
}
474
- return arr;
474
+ stack = append (stack, i)
475
475
}
476
476
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 ]]
486
486
}
487
- System . out. println(" test finish" );
487
+
488
+ max = int (math.Max (float64 (max), float64 (m * arr[j])))
488
489
}
489
490
491
+ return max
490
492
}
491
493
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
+ }
492
499
```
0 commit comments