Given an integer array nums, return the most frequent even element.
If there is a tie, return the smallest one. If there is no such element, return -1.
Example 1:
Input: nums = [0,1,2,2,4,4,1]
Output: 2
Explanation:
The even elements are 0, 2, and 4. Of these, 2 and 4 appear the most.
We return the smallest one, which is 2.
Example 2:
Input: nums = [4,4,4,9,2,4]
Output: 4
Explanation: 4 is the even element appears the most.
Example 3:
Input: nums = [29,47,21,41,13,37,25,7]
Output: -1
Explanation: There is no even element.
Constraints:
1 <= nums.length <= 2000
0 <= nums[i] <= 105
Solution: Hashtable
Use a hashtable to store the frequency of even numbers.
Implement FreqStack, a class which simulates the operation of a stack-like data structure.
FreqStack has two functions:
push(int x), which pushes an integer x onto the stack.
pop(), which removes and returns the most frequent element in the stack.
If there is a tie for most frequent element, the element closest to the top of the stack is removed and returned.
Example 1:
Input: ["FreqStack","push","push","push","push","push","push","pop","pop","pop","pop"],
[[],[5],[7],[5],[7],[4],[5],[],[],[],[]]Output: [null,null,null,null,null,null,null,5,7,5,4]Explanation:
After making six .push operations, the stack is [5,7,5,7,4,5] from bottom to top. Then:
pop() -> returns 5, as 5 is the most frequent.
The stack becomes [5,7,5,7,4].
pop() -> returns 7, as 5 and 7 is the most frequent, but 7 is closest to the top.
The stack becomes [5,7,5,4].
pop() -> returns 5.
The stack becomes [5,7,4].
pop() -> returns 4.
The stack becomes [5,7].
Note:
Calls to FreqStack.push(int x) will be such that 0 <= x <= 10^9.
It is guaranteed that FreqStack.pop() won’t be called if the stack has zero elements.
The total number of FreqStack.push calls will not exceed 10000 in a single test case.
The total number of FreqStack.pop calls will not exceed 10000 in a single test case.
The total number of FreqStack.push and FreqStack.pop calls will not exceed 150000 across all test cases.
Solution 1: Buckets
We have n stacks. The i-th stack has the of elements with freq i when pushed.
We keep tracking the freq of each element.
push(x): stacks[++freq(x)].push(x) # inc x’s freq and push it onto freq-th stack
pop(): x = stacks[max_freq].pop(), –freq(x); # pop element x from the max_freq stack and dec it’s freq.
Time complexity: O(1) push / pop
Space complexity: O(n)
C++
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
// Author: Huahua
// Running time: 144 ms
classFreqStack{
public:
FreqStack(){}
voidpush(intx){
auto it=freq_.find(x);
if(it==freq_.end())
it=freq_.emplace(x,0).first;
intfreq=++it->second;
if(stacks_.size()<freq)stacks_.push_back({});
stacks_[freq-1].push(x);
}
intpop(){
intx=stacks_.back().top();
stacks_.back().pop();
if(stacks_.back().empty())
stacks_.pop_back();
auto it=freq_.find(x);
if(!(--it->second))
freq_.erase(it);
returnx;
}
private:
vector<stack<int>>stacks_;
unordered_map<int,int>freq_;
};
Solution2: Priority Queue
Use a max heap with key: (freq, seq), the max freq and closest to the top of stack element will be extracted first.