最大频率栈
https://leetcode-cn.com/problems/maximum-frequency-stack/
需求分析:
- 每次
pop
时,必须要知道频率最高的元素是什么:使用一个变量 maxFreq
记录最大频率
- 每次
push
时,要知道对应元素的频率:使用哈希表 valToFreq
记录频率
- 如果频率最高的元素有多个,还得知道哪个是最近
push
进来的元素是哪个:使用哈希表+栈 freqToVal
记录相同频率的元素,且栈储存了时间信息
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
| type FreqStack struct { maxFreq int valToFreq map[int]int freqToVal map[int][]int }
func Constructor() FreqStack { VF := make(map[int]int) FV := make(map[int][]int) return FreqStack{0, VF, FV} }
func (this *FreqStack) Push(val int) { this.valToFreq[val] += 1 f := this.valToFreq[val] this.freqToVal[f] = append(this.freqToVal[f], val) this.maxFreq = max(this.maxFreq, f) }
func (this *FreqStack) Pop() int { p := this.freqToVal[this.maxFreq][len(this.freqToVal[this.maxFreq])-1] this.freqToVal[this.maxFreq] = this.freqToVal[this.maxFreq][:len(this.freqToVal[this.maxFreq])-1] if len(this.freqToVal[this.maxFreq]) == 0 { delete(this.freqToVal, this.maxFreq) this.maxFreq-- }
this.valToFreq[p]--
return p }
func max(a, b int) int { if a > b { return a } return b }
|