155.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package main
  2. // MinStackOld ...
  3. type MinStackOld struct {
  4. val []int
  5. min []int
  6. top int
  7. }
  8. // ConstructorOld /** initialize your data structure here. */
  9. func ConstructorOld() MinStackOld {
  10. s := MinStackOld{make([]int, 0), make([]int, 0), -1}
  11. return s
  12. }
  13. // Push ...
  14. func (stack *MinStackOld) Push(x int) {
  15. stack.val = append(stack.val, x)
  16. stack.top++
  17. idx := 0
  18. for ; idx < stack.top; idx++ {
  19. if x > stack.val[idx] {
  20. break
  21. }
  22. }
  23. stack.min = append(stack.min, 0)
  24. copy(stack.min[idx+1:stack.top+1], stack.min[idx:stack.top])
  25. stack.min[idx] = x
  26. }
  27. // Pop ...
  28. func (stack *MinStackOld) Pop() {
  29. if stack.top != -1 {
  30. idx := 0
  31. for ; idx < stack.top+1; idx++ {
  32. if stack.min[idx] == stack.val[stack.top] {
  33. break
  34. }
  35. }
  36. stack.min = append(stack.min[:idx], stack.min[idx+1:]...)
  37. stack.val = stack.val[:stack.top]
  38. stack.top--
  39. }
  40. }
  41. // Top ...
  42. func (stack *MinStackOld) Top() int {
  43. return stack.val[stack.top]
  44. }
  45. // GetMin ...
  46. func (stack *MinStackOld) GetMin() int {
  47. return stack.min[stack.top]
  48. }
  49. /**
  50. * Your MinStack object will be instantiated and called as such:
  51. * obj := Constructor();
  52. * obj.Push(x);
  53. * obj.Pop();
  54. * param_3 := obj.Top();
  55. * param_4 := obj.GetMin();
  56. */
  57. // MinStack ...
  58. type MinStack struct {
  59. val []int
  60. min []int
  61. }
  62. // Constructor /** initialize your data structure here. */
  63. func Constructor() MinStack {
  64. return MinStack{}
  65. }
  66. // Push important! min []int stores the "current miximum"
  67. func (stack *MinStack) Push(x int) {
  68. stack.val = append(stack.val, x)
  69. if len(stack.min) == 0 {
  70. stack.min = append(stack.min, x)
  71. return
  72. }
  73. m := stack.min[len(stack.min)-1]
  74. if x < m {
  75. stack.min = append(stack.min, x)
  76. return
  77. }
  78. stack.min = append(stack.min, m)
  79. }
  80. // Pop ...
  81. func (stack *MinStack) Pop() {
  82. n := len(stack.val) - 1
  83. stack.val = stack.val[:n]
  84. stack.min = stack.min[:n]
  85. }
  86. // Top ...
  87. func (stack *MinStack) Top() int {
  88. return stack.val[len(stack.val)-1]
  89. }
  90. // GetMin ...
  91. func (stack *MinStack) GetMin() int {
  92. return stack.min[len(stack.min)-1]
  93. }
  94. // func main() {
  95. // stack := Constructor()
  96. // stack.Push(1)
  97. // fmt.Println(stack.Top())
  98. // fmt.Println(stack.GetMin())
  99. // }