Guest User

Untitled

a guest
Dec 16th, 2021
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.47 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "math/rand"
  5.     "strconv"
  6.     "testing"
  7. )
  8.  
  9. func makeRandomSlice(rnd *rand.Rand, n int) []int {
  10.     s := make([]int, n)
  11.     for i := 0; i < len(s); i++ {
  12.         s[i] = rnd.Intn(65535)
  13.     }
  14.     return s
  15. }
  16.  
  17. func BenchmarkFence(b *testing.B) {
  18.     ranges := []int{10, 100, 1000, 10_000, 100_000}
  19.  
  20.     rnd := rand.New(rand.NewSource(12345))
  21.  
  22.     var slices [][]int
  23.     for _, r := range ranges {
  24.         slices = append(slices, makeRandomSlice(rnd, r))
  25.     }
  26.     b.ResetTimer()
  27.  
  28.     for si, r := range ranges {
  29.         b.Run(strconv.Itoa(r), func(b *testing.B) {
  30.             for i := 0; i < b.N; i++ {
  31.                 _ = solve(slices[si])
  32.             }
  33.         })
  34.     }
  35. }
  36.  
  37. func solve(arr []int) int {
  38.     if len(arr) == 0 {
  39.         return 0
  40.     }
  41.     if len(arr) == 1 {
  42.         return arr[0]
  43.     }
  44.     mid := len(arr) / 2
  45.     leftMax := solve(arr[:mid])
  46.     rightMax := solve(arr[mid:])
  47.     midMax := findMidMax(arr)
  48.  
  49.     return max(leftMax, max(rightMax, midMax))
  50. }
  51.  
  52. func findMidMax(arr []int) int {
  53.     mid := len(arr) / 2
  54.     left, right := mid-1, mid
  55.     minHeight := min(arr[left], arr[right])
  56.     ret := minHeight * 2
  57.     for left > 0 || right+1 < len(arr) {
  58.         if left > 0 && (right+1 == len(arr) || arr[left-1] > arr[right+1]) {
  59.             left--
  60.             minHeight = min(minHeight, arr[left])
  61.         } else {
  62.             right++
  63.             minHeight = min(minHeight, arr[right])
  64.         }
  65.         ret = max(ret, minHeight*(right-left+1))
  66.     }
  67.     return ret
  68. }
  69.  
  70. func min(a int, b int) int {
  71.     if a > b {
  72.         return b
  73.     }
  74.     return a
  75. }
  76. func max(a int, b int) int {
  77.     if a < b {
  78.         return b
  79.     }
  80.     return a
  81. }
  82.  
Advertisement
Add Comment
Please, Sign In to add comment