Integers K, M and a non-empty array A consisting of N integers, not bigger than M, are given.
The leader of the array is a value that occurs in more than half of the elements of the array, and the segment of the array is a sequence of consecutive elements of the array.
You can modify A by choosing exactly one segment of length K and increasing by 1 every element within that segment.
The goal is to find all of the numbers that may become a leader after performing exactly one array modification as described above.
Write a function:
vector<int> solution(int K, int M, vector<int> &A);
that, given integers K and M and an array A consisting of N integers, returns an array of all numbers that can become a leader, after increasing by 1 every element of exactly one segment of A of length K. The returned array should be sorted in ascending order, and if there is no number that can become a leader, you should return an empty array. Moreover, if there are multiple ways of choosing a segment to turn some number into a leader, then this particular number should appear in an output array only once.
For example, given integers K = 3, M = 5 and the following array A:
A[0] = 2 A[1] = 1 A[2] = 3 A[3] = 1 A[4] = 2 A[5] = 2 A[6] = 3the function should return [2, 3]. If we choose segment A[1], A[2], A[3] then we get the following array A:
A[0] = 2 A[1] = 2 A[2] = 4 A[3] = 2 A[4] = 2 A[5] = 2 A[6] = 3and 2 is the leader of this array. If we choose A[3], A[4], A[5] then A will appear as follows:
A[0] = 2 A[1] = 1 A[2] = 3 A[3] = 2 A[4] = 3 A[5] = 3 A[6] = 3and 3 will be the leader.
And, for example, given integers K = 4, M = 2 and the following array:
A[0] = 1 A[1] = 2 A[2] = 2 A[3] = 1 A[4] = 2the function should return [2, 3], because choosing a segment A[0], A[1], A[2], A[3] and A[1], A[2], A[3], A[4] turns 2 and 3 into the leaders, respectively.
Write an efficient algorithm for the following assumptions:
- N and M are integers within the range [1..100,000];
- K is an integer within the range [1..N];
- each element of array A is an integer within the range [1..M].
// you can use includes, for example:
// you can use includes, for example:
#include <bits/stdc++.h>
using namespace std;
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
vector<int> solution(int K, int M, vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
set<int>s;
map<int,int> freq;
pair<int,int> maxel=make_pair(0,0);
for(int i=0;i<A.size();i++){
if(freq.find(A[i])!=freq.end()){
freq[A[i]]+=1;
}else{
freq[A[i]]=1;
}
if(maxel.first<freq[A[i]]){
maxel=make_pair(freq[A[i]],A[i]);
}
}
// for(auto it=freq.begin();it!=freq.end();it++){
// cout<< it->first<<":"<<it->second<<"\n";
// }
// priority_queue<pair<int,int> >pq;
// for(auto it=freq.begin();it!=freq.end();it++){
// pq.push({it->second,it->first});
// }
// pq.push({-3,0});
// pq.push({1,2});
// pair<int,int>p1=pq.top();
// cout<<"p1:"<<p1.first<<"\n";
map<int,int> currFreq;
for(int i=0;i<K;i++){
if(currFreq.find(A[i])!=freq.end()){
currFreq[A[i]]+=1;
}else{
currFreq[A[i]]=1;
}
}
// cout<<"currFreq:-\n";
for(auto it=currFreq.begin();it!=currFreq.end();it++){
cout<< it->first<<":"<<it->second<<"\n";
int occ=freq[(it->first)+1]+it->second-(currFreq.find((it->first)+1)==currFreq.end()?0:currFreq[(it->first)+1]);
if(occ>A.size()/2){
s.insert(it->first+1);
}
// if(pq.top().first-(currFreq.find((it->first)+1)==currFreq.end()?0:currFreq[it->second])>A.size()/2){
// s.insert(pq.top().second);
// }
}
if(maxel.first-(currFreq.find((maxel.second))==currFreq.end()?0:currFreq[maxel.second])>A.size()/2){
s.insert(maxel.second);
}
for(int i=K;i<A.size();i++){
currFreq[A[i-K]]-=1;
if(currFreq.find(A[i])!=freq.end()){
currFreq[A[i]]+=1;
}else{
currFreq[A[i]]=1;
}
for(int j=i-K+1;j<=i;j++){
int occ=freq[A[j]+1]+currFreq[A[j]]-(currFreq.find(A[j]+1)==currFreq.end()?0:currFreq[A[j]+1]);
// cout<<"A[i]:"<<A[j]<<" freq[A[i]+1]:"<<freq[A[j]+1]<<" currFreq[A[i]]:"<<currFreq[A[j]]<<" (currFreq.find(A[i]+1)==currFreq.end()?0:currFreq[A[i]+1]):"<<(currFreq.find(A[j]+1)==currFreq.end()?0:currFreq[A[j]+1])<<"\n";
if(occ>A.size()/2){
s.insert(A[j]+1);
}
}
// if(pq.top().first-(currFreq.find(A[i]+1)==currFreq.end()?0:currFreq[A[i]+1])>A.size()/2){
// s.insert(pq.top().second);
// }
if(maxel.first-(currFreq.find(maxel.second)==currFreq.end()?0:currFreq[maxel.second])>A.size()/2){
s.insert(maxel.second);
}
}
vector<int> ans(s.begin(),s.end());
return ans;
}
int main()
{
vector<int> arr;
arr.push_back(50);
arr.push_back(50);
arr.push_back(50);
arr.push_back(49);
arr.push_back(9);
arr.push_back(49);
arr.push_back(7);
arr.push_back(3);
arr.push_back(7);
vector<int> ans = solution(4, 15, arr);
for (auto it = ans.begin(); it != ans.end(); it++)
{
cout << *it << " ";
}
return 0;
}
// you can use includes, for example:
// you can use includes, for example:
#include <bits/stdc++.h>
using namespace std;
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
vector<int> solution(int K, int M, vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
set<int>s;
map<int,int> freq;
pair<int,int> maxel=make_pair(0,0);
for(int i=0;i<A.size();i++){
if(freq.find(A[i])!=freq.end()){
freq[A[i]]+=1;
}else{
freq[A[i]]=1;
}
if(maxel.first<freq[A[i]]){
maxel=make_pair(freq[A[i]],A[i]);
}
}
// for(auto it=freq.begin();it!=freq.end();it++){
// cout<< it->first<<":"<<it->second<<"\n";
// }
// priority_queue<pair<int,int> >pq;
// for(auto it=freq.begin();it!=freq.end();it++){
// pq.push({it->second,it->first});
// }
// pq.push({-3,0});
// pq.push({1,2});
// pair<int,int>p1=pq.top();
// cout<<"p1:"<<p1.first<<"\n";
map<int,int> currFreq;
for(int i=0;i<K;i++){
if(currFreq.find(A[i])!=freq.end()){
currFreq[A[i]]+=1;
}else{
currFreq[A[i]]=1;
}
}
// cout<<"currFreq:-\n";
for(auto it=currFreq.begin();it!=currFreq.end();it++){
cout<< it->first<<":"<<it->second<<"\n";
int occ=freq[(it->first)+1]+it->second-(currFreq.find((it->first)+1)==currFreq.end()?0:currFreq[(it->first)+1]);
if(occ>A.size()/2){
s.insert(it->first+1);
}
// if(pq.top().first-(currFreq.find((it->first)+1)==currFreq.end()?0:currFreq[it->second])>A.size()/2){
// s.insert(pq.top().second);
// }
}
if(maxel.first-(currFreq.find((maxel.second))==currFreq.end()?0:currFreq[maxel.second])>A.size()/2){
s.insert(maxel.second);
}
for(int i=K;i<A.size();i++){
currFreq[A[i-K]]-=1;
if(currFreq.find(A[i])!=freq.end()){
currFreq[A[i]]+=1;
}else{
currFreq[A[i]]=1;
}
for(int j=i-K+1;j<=i;j++){
int occ=freq[A[j]+1]+currFreq[A[j]]-(currFreq.find(A[j]+1)==currFreq.end()?0:currFreq[A[j]+1]);
// cout<<"A[i]:"<<A[j]<<" freq[A[i]+1]:"<<freq[A[j]+1]<<" currFreq[A[i]]:"<<currFreq[A[j]]<<" (currFreq.find(A[i]+1)==currFreq.end()?0:currFreq[A[i]+1]):"<<(currFreq.find(A[j]+1)==currFreq.end()?0:currFreq[A[j]+1])<<"\n";
if(occ>A.size()/2){
s.insert(A[j]+1);
}
}
// if(pq.top().first-(currFreq.find(A[i]+1)==currFreq.end()?0:currFreq[A[i]+1])>A.size()/2){
// s.insert(pq.top().second);
// }
if(maxel.first-(currFreq.find(maxel.second)==currFreq.end()?0:currFreq[maxel.second])>A.size()/2){
s.insert(maxel.second);
}
}
vector<int> ans(s.begin(),s.end());
return ans;
}
// int main()
// {
// vector<int> arr;
// arr.push_back(50);
// arr.push_back(50);
// arr.push_back(50);
// arr.push_back(49);
// arr.push_back(9);
// arr.push_back(49);
// arr.push_back(7);
// arr.push_back(3);
// arr.push_back(7);
// vector<int> ans = solution(4, 15, arr);
// for (auto it = ans.begin(); it != ans.end(); it++)
// {
// cout << *it << " ";
// }
// return 0;
// }
// you can use includes, for example:
// you can use includes, for example:
#include <bits/stdc++.h>
using namespace std;
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
vector<int> solution(int K, int M, vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
set<int>s;
map<int,int> freq;
pair<int,int> maxel=make_pair(0,0);
for(int i=0;i<A.size();i++){
if(freq.find(A[i])!=freq.end()){
freq[A[i]]+=1;
}else{
freq[A[i]]=1;
}
if(maxel.first<freq[A[i]]){
maxel=make_pair(freq[A[i]],A[i]);
}
}
// for(auto it=freq.begin();it!=freq.end();it++){
// cout<< it->first<<":"<<it->second<<"\n";
// }
// priority_queue<pair<int,int> >pq;
// for(auto it=freq.begin();it!=freq.end();it++){
// pq.push({it->second,it->first});
// }
// pq.push({-3,0});
// pq.push({1,2});
// pair<int,int>p1=pq.top();
// cout<<"p1:"<<p1.first<<"\n";
map<int,int> currFreq;
for(int i=0;i<K;i++){
if(currFreq.find(A[i])!=freq.end()){
currFreq[A[i]]+=1;
}else{
currFreq[A[i]]=1;
}
}
// cout<<"currFreq:-\n";
for(auto it=currFreq.begin();it!=currFreq.end();it++){
// cout<< it->first<<":"<<it->second<<"\n";
int occ=freq[(it->first)+1]+it->second-(currFreq.find((it->first)+1)==currFreq.end()?0:currFreq[(it->first)+1]);
if(occ>A.size()/2){
s.insert(it->first+1);
}
// if(pq.top().first-(currFreq.find((it->first)+1)==currFreq.end()?0:currFreq[it->second])>A.size()/2){
// s.insert(pq.top().second);
// }
}
if(maxel.first-(currFreq.find((maxel.second))==currFreq.end()?0:currFreq[maxel.second])>A.size()/2){
s.insert(maxel.second);
}
for(int i=K;i<A.size();i++){
currFreq[A[i-K]]-=1;
if(currFreq.find(A[i])!=freq.end()){
currFreq[A[i]]+=1;
}else{
currFreq[A[i]]=1;
}
for(int j=i-K+1;j<=i;j++){
int occ=freq[A[j]+1]+currFreq[A[j]]-(currFreq.find(A[j]+1)==currFreq.end()?0:currFreq[A[j]+1]);
// cout<<"A[i]:"<<A[j]<<" freq[A[i]+1]:"<<freq[A[j]+1]<<" currFreq[A[i]]:"<<currFreq[A[j]]<<" (currFreq.find(A[i]+1)==currFreq.end()?0:currFreq[A[i]+1]):"<<(currFreq.find(A[j]+1)==currFreq.end()?0:currFreq[A[j]+1])<<"\n";
if(occ>A.size()/2){
s.insert(A[j]+1);
}
}
// if(pq.top().first-(currFreq.find(A[i]+1)==currFreq.end()?0:currFreq[A[i]+1])>A.size()/2){
// s.insert(pq.top().second);
// }
if(maxel.first-(currFreq.find(maxel.second)==currFreq.end()?0:currFreq[maxel.second])>A.size()/2){
s.insert(maxel.second);
}
}
vector<int> ans(s.begin(),s.end());
return ans;
}
// int main()
// {
// vector<int> arr;
// arr.push_back(50);
// arr.push_back(50);
// arr.push_back(50);
// arr.push_back(49);
// arr.push_back(9);
// arr.push_back(49);
// arr.push_back(7);
// arr.push_back(3);
// arr.push_back(7);
// vector<int> ans = solution(4, 15, arr);
// for (auto it = ans.begin(); it != ans.end(); it++)
// {
// cout << *it << " ";
// }
// return 0;
// }
// you can use includes, for example:
// you can use includes, for example:
#include <bits/stdc++.h>
using namespace std;
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
vector<int> solution(int K, int M, vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
set<int>s;
map<int,int> freq;
pair<int,int> maxel=make_pair(0,0);
for(int i=0;i<A.size();i++){
if(freq.find(A[i])!=freq.end()){
freq[A[i]]+=1;
}else{
freq[A[i]]=1;
}
if(maxel.first<freq[A[i]]){
maxel=make_pair(freq[A[i]],A[i]);
}
}
// for(auto it=freq.begin();it!=freq.end();it++){
// cout<< it->first<<":"<<it->second<<"\n";
// }
// priority_queue<pair<int,int> >pq;
// for(auto it=freq.begin();it!=freq.end();it++){
// pq.push({it->second,it->first});
// }
// pq.push({-3,0});
// pq.push({1,2});
// pair<int,int>p1=pq.top();
// cout<<"p1:"<<p1.first<<"\n";
map<int,int> currFreq;
for(int i=0;i<K;i++){
if(currFreq.find(A[i])!=freq.end()){
currFreq[A[i]]+=1;
}else{
currFreq[A[i]]=1;
}
}
// cout<<"currFreq:-\n";
for(auto it=currFreq.begin();it!=currFreq.end();it++){
// cout<< it->first<<":"<<it->second<<"\n";
int occ=freq[(it->first)+1]+it->second-(currFreq.find((it->first)+1)==currFreq.end()?0:currFreq[(it->first)+1]);
if(occ>A.size()/2){
s.insert(it->first+1);
}
// if(pq.top().first-(currFreq.find((it->first)+1)==currFreq.end()?0:currFreq[it->second])>A.size()/2){
// s.insert(pq.top().second);
// }
}
if(maxel.first-(currFreq.find((maxel.second))==currFreq.end()?0:currFreq[maxel.second])>A.size()/2){
s.insert(maxel.second);
}
for(int i=K;i<A.size();i++){
currFreq[A[i-K]]-=1;
if(currFreq.find(A[i])!=freq.end()){
currFreq[A[i]]+=1;
}else{
currFreq[A[i]]=1;
}
for(int j=i-K+1;j<=i;j++){
int occ=freq[A[j]+1]+currFreq[A[j]]-(currFreq.find(A[j]+1)==currFreq.end()?0:currFreq[A[j]+1]);
// cout<<"A[i]:"<<A[j]<<" freq[A[i]+1]:"<<freq[A[j]+1]<<" currFreq[A[i]]:"<<currFreq[A[j]]<<" (currFreq.find(A[i]+1)==currFreq.end()?0:currFreq[A[i]+1]):"<<(currFreq.find(A[j]+1)==currFreq.end()?0:currFreq[A[j]+1])<<"\n";
if(occ>A.size()/2){
s.insert(A[j]+1);
}
}
// if(pq.top().first-(currFreq.find(A[i]+1)==currFreq.end()?0:currFreq[A[i]+1])>A.size()/2){
// s.insert(pq.top().second);
// }
if(maxel.first-(currFreq.find(maxel.second)==currFreq.end()?0:currFreq[maxel.second])>A.size()/2){
s.insert(maxel.second);
}
}
vector<int> ans(s.begin(),s.end());
return ans;
}
// int main()
// {
// vector<int> arr;
// arr.push_back(50);
// arr.push_back(50);
// arr.push_back(50);
// arr.push_back(49);
// arr.push_back(9);
// arr.push_back(49);
// arr.push_back(7);
// arr.push_back(3);
// arr.push_back(7);
// vector<int> ans = solution(4, 15, arr);
// for (auto it = ans.begin(); it != ans.end(); it++)
// {
// cout << *it << " ";
// }
// return 0;
// }
// you can use includes, for example:
// you can use includes, for example:
#include <bits/stdc++.h>
using namespace std;
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
vector<int> solution(int K, int M, vector<int> &A) {
// write your code in C++14 (g++ 6.2.0)
set<int>s;
map<int,int> freq;
pair<int,int> maxel=make_pair(0,0);
for(int i=0;i<A.size();i++){
if(freq.find(A[i])!=freq.end()){
freq[A[i]]+=1;
}else{
freq[A[i]]=1;
}
if(maxel.first<freq[A[i]]){
maxel=make_pair(freq[A[i]],A[i]);
}
}
// for(auto it=freq.begin();it!=freq.end();it++){
// cout<< it->first<<":"<<it->second<<"\n";
// }
// priority_queue<pair<int,int> >pq;
// for(auto it=freq.begin();it!=freq.end();it++){
// pq.push({it->second,it->first});
// }
// pq.push({-3,0});
// pq.push({1,2});
// pair<int,int>p1=pq.top();
// cout<<"p1:"<<p1.first<<"\n";
map<int,int> currFreq;
for(int i=0;i<K;i++){
if(currFreq.find(A[i])!=freq.end()){
currFreq[A[i]]+=1;
}else{
currFreq[A[i]]=1;
}
}
// cout<<"currFreq:-\n";
for(auto it=currFreq.begin();it!=currFreq.end();it++){
// cout<< it->first<<":"<<it->second<<"\n";
int occ=freq[(it->first)+1]+it->second-(currFreq.find((it->first)+1)==currFreq.end()?0:currFreq[(it->first)+1]);
if(occ>A.size()/2){
s.insert(it->first+1);
}
// if(pq.top().first-(currFreq.find((it->first)+1)==currFreq.end()?0:currFreq[it->second])>A.size()/2){
// s.insert(pq.top().second);
// }
}
if(maxel.first-(currFreq.find((maxel.second))==currFreq.end()?0:currFreq[maxel.second])>A.size()/2){
s.insert(maxel.second);
}
for(int i=K;i<A.size();i++){
currFreq[A[i-K]]-=1;
if(currFreq.find(A[i])!=freq.end()){
currFreq[A[i]]+=1;
}else{
currFreq[A[i]]=1;
}
for(int j=i-K+1;j<=i;j++){
int occ=freq[A[j]+1]+currFreq[A[j]]-(currFreq.find(A[j]+1)==currFreq.end()?0:currFreq[A[j]+1]);
// cout<<"A[i]:"<<A[j]<<" freq[A[i]+1]:"<<freq[A[j]+1]<<" currFreq[A[i]]:"<<currFreq[A[j]]<<" (currFreq.find(A[i]+1)==currFreq.end()?0:currFreq[A[i]+1]):"<<(currFreq.find(A[j]+1)==currFreq.end()?0:currFreq[A[j]+1])<<"\n";
if(occ>A.size()/2){
s.insert(A[j]+1);
}
}
// if(pq.top().first-(currFreq.find(A[i]+1)==currFreq.end()?0:currFreq[A[i]+1])>A.size()/2){
// s.insert(pq.top().second);
// }
if(maxel.first-(currFreq.find(maxel.second)==currFreq.end()?0:currFreq[maxel.second])>A.size()/2){
s.insert(maxel.second);
}
}
vector<int> ans(s.begin(),s.end());
return ans;
}
// int main()
// {
// vector<int> arr;
// arr.push_back(50);
// arr.push_back(50);
// arr.push_back(50);
// arr.push_back(49);
// arr.push_back(9);
// arr.push_back(49);
// arr.push_back(7);
// arr.push_back(3);
// arr.push_back(7);
// vector<int> ans = solution(4, 15, arr);
// for (auto it = ans.begin(); it != ans.end(); it++)
// {
// cout << *it << " ";
// }
// return 0;
// }
The following issues have been detected: timeout errors.
medium tests (N = 10000, M = 100)
running time: 0.424 sec., time limit: 0.100 sec.
medium tests(N >= 20000, M=30000)
running time: 2.024 sec., time limit: 0.100 sec.