-
Notifications
You must be signed in to change notification settings - Fork 0
/
16-Majority Element - II
63 lines (53 loc) · 1.18 KB
/
16-Majority Element - II
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
#include <bits/stdc++.h>
vector<int> majorityElementII(vector<int> &arr)
{
// Write your code here.
// int n=arr.size();
// vector<int> ans;
// unordered_map<int,int> mp;
// for(int i=0;i<arr.size();i++){
// mp[arr[i]]++;
// }
// for(auto i:mp){
// if(i.second > n/3){
// ans.push_back(i.first);
// }
// }
// return ans;
//Optimal Approch
int n=arr.size();
int cnt1=0,cnt2=0;
int el1=INT_MIN;
int el2=INT_MIN;
for(int i=0;i<n;i++){
if(cnt1==0 && el2 != arr[i]){
cnt1=1;
el1=arr[i];
}
else if(cnt2==0 && el1 != arr[i]){
cnt2=1;
el2=arr[i];
}
else if(arr[i]==el1) cnt1++;
else if(arr[i]==el2) cnt2++;
else{
cnt1--;
cnt2--;
}
}
vector<int> ans;
cnt1=0,cnt2=0;
for(int i=0;i<n;i++){
if(arr[i]==el1){
cnt1++;
}
if(arr[i]==el2){
cnt2++;
}
}
int mini=(int)(n/3)+1;
if(cnt1 >= mini) ans.push_back(el1);
if(cnt2 >= mini) ans.push_back(el2);
sort(ans.begin(),ans.end());
return ans;
}