-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfreq_stack.go
90 lines (79 loc) · 2.13 KB
/
freq_stack.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// https://leetcode.com/problems/maximum-frequency-stack/description/
package main
type FreqStack struct {
element_freq map[int]int // element to freq histogram
freq_element map[int][]int // freq_count to element list (element list ordered from earliest to latest for next element in the stack for that given freq)
most_freq int // highest freq count
stack []int //actual stack
}
func Constructor() FreqStack {
return FreqStack{
element_freq: make(map[int]int),
freq_element: make(map[int][]int),
most_freq: 0,
stack: []int{},
}
}
func (f *FreqStack) Push(val int) {
//element_freq mapping update
f.element_freq[val]++
f.freq_element[f.element_freq[val]] = append(f.freq_element[f.element_freq[val]], val)
//update most_freqq
if f.element_freq[val] > f.most_freq {
f.most_freq = f.element_freq[val]
}
//finally appeen to stack
f.stack = append(f.stack, val)
}
func (f *FreqStack) Pop() int {
//update freq_element
li := len(f.freq_element[f.most_freq]) - 1
latest_most_freq_elemt := f.freq_element[f.most_freq][li]
f.freq_element[f.most_freq] = f.freq_element[f.most_freq][:li]
if len(f.freq_element[f.most_freq]) == 0 {
delete(f.freq_element, f.most_freq)
}
// update this.most_freq
new_most_freq := 0
for i := (f.most_freq); i > 0; i-- {
if _, ok := f.freq_element[i]; ok {
new_most_freq = i
break
}
}
f.most_freq = new_most_freq
//update element_freq
f.element_freq[latest_most_freq_elemt]--
stack_index := 0
for i := len(f.stack) - 1; i > 0; i-- {
elem := f.stack[i]
if elem == latest_most_freq_elemt {
stack_index = i
break
}
}
//update stack
return_elem := f.stack[stack_index]
f.stack = append(f.stack[0:stack_index], f.stack[(stack_index+1):]...)
return return_elem
}
// func main() {
// obj := Constructor()
// obj.Push(5)
// obj.Push(7)
// obj.Push(5)
// obj.Push(7)
// obj.Push(4)
// obj.Push(5)
// p0 := obj.Pop()
// p1 := obj.Pop()
// p2 := obj.Pop()
// p3 := obj.Pop()
// print(p0, p1, p2, p3)
// }
/**
* Your FreqStack object will be instantiated and called as such:
* obj := Constructor();
* obj.Push(val);
* param_2 := obj.Pop();
*/