Maximum frequency of any array element possible by exactly K increments
Given an array arr[] consisting of N positive integers and an integer K, the task is to find the highest frequency of any array element after performing exactly K increments.
Examples:
Input: arr[] = {1, 3, 2, 2}, K = 2
Output: 3
Explanation:
Below are the operations performed:
- Add 1 to the element at index 2(= 2), then the array modifies to {1, 3, 3, 2}.
- Add 1 to the element at index 3(= 2), then the array modifies to {1, 3, 3, 3}.
After the above steps, the maximum frequency of an array element is 3.
Input: arr[] = {4, 3, 4}, K = 5
Output: 2
Approach: The given problem can be solved by using the Sliding Window Technique and Sorting. Follow the steps below to solve this problem:
- Initialize the variables say start, end, sum as 0, and mostFreq as INT_MIN.
- Sort the array arr[] in increasing order.
- Iterate over the range [0, N – 1] using the variable end and perform the following steps:
- Increment the value of sum by the value arr[end].
- While the value of (sum + K) is less than the value of (arr[end] * (end – start+ 1)), then decrement the value of the sum by arr[start] and increment the value of start by 1.
- Update the value of mostFreq to the maximum of mostFreq and (end – start + 1).
- Initialize a variable, say reqSum as the value of (arr[N-1] * N – sum) that stores the resultant sum to make all the array elements equal.
- If the value of mostFreq is N and the value of K is greater than reqSum, then decrement the value of K by reqSum.
- If the value of K is a multiple of N, then print N. Otherwise, print the value of (N – 1).
- After completing the above steps, print the value of mostFreq as the result.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findMostFrequent( int arr[], int N,
int K)
{
int start = 0, end = 0;
sort(arr, arr + N);
int mostFreq = INT_MIN, sum = 0;
for (end = 0; end < N; end++) {
sum = sum + arr[end];
while (sum + K < arr[end] * (end - start + 1)) {
sum = sum - arr[start];
start++;
}
mostFreq = max(mostFreq,
end - start + 1);
}
int reqSum = arr[N - 1] * N - sum;
if (mostFreq == N && reqSum < K) {
K = K - reqSum;
if (K % N == 0) {
cout << N << endl;
}
else {
cout << N - 1 << endl;
}
return ;
}
cout << mostFreq << endl;
}
int main()
{
int arr[] = { 4, 3, 4 };
int K = 5;
int N = sizeof (arr) / sizeof (arr[0]);
findMostFrequent(arr, N, K);
return 0;
}
|
Java
import java.util.*;
class GFG {
static void findMostFrequent( int arr[], int N,
int K)
{
int start = 0 , end = 0 ;
Arrays.sort(arr);
int mostFreq = Integer.MIN_VALUE, sum = 0 ;
for (end = 0 ; end < N; end++) {
sum = sum + arr[end];
while (sum + K < arr[end] * (end - start + 1 )) {
sum = sum - arr[start];
start++;
}
mostFreq = Math.max(mostFreq,
end - start + 1 );
}
int reqSum = arr[N - 1 ] * N - sum;
if (mostFreq == N && reqSum < K) {
K = K - reqSum;
if (K % N == 0 ) {
System.out.println(N);
}
else {
System.out.println(N - 1 );
}
return ;
}
System.out.println( mostFreq);
}
public static void main(String[] args)
{
int arr[] = { 4 , 3 , 4 };
int K = 5 ;
int N = arr.length;
findMostFrequent(arr, N, K);
}
}
|
Python3
def findMostFrequent( arr, N, K):
start = 0
end = 0
arr.sort()
mostFreq = - 2 * * 31
sum = 0
for end in range (N):
sum = sum + arr[end]
while ( sum + K < arr[end] * (end - start + 1 )):
sum = sum - arr[start]
start + = 1
mostFreq = max (mostFreq, end - start + 1 )
reqSum = arr[N - 1 ] * N - sum
if (mostFreq = = N and reqSum < K):
K = K - reqSum
if (K % N = = 0 ):
print (N)
else :
print (N - 1 )
return
print (mostFreq)
arr = [ 4 , 3 , 4 ]
K = 5
N = len (arr)
findMostFrequent(arr, N, K)
|
C#
using System;
class GFG{
static void findMostFrequent( int []arr, int N,
int K)
{
int start = 0, end = 0;
Array.Sort(arr);
int mostFreq = Int32.MinValue, sum = 0;
for (end = 0; end < N; end++)
{
sum = sum + arr[end];
while (sum + K < arr[end] * (end - start + 1))
{
sum = sum - arr[start];
start++;
}
mostFreq = Math.Max(mostFreq,
end - start + 1);
}
int reqSum = arr[N - 1] * N - sum;
if (mostFreq == N && reqSum < K)
{
K = K - reqSum;
if (K % N == 0)
{
Console.Write(N);
}
else
{
Console.Write(N - 1);
}
return ;
}
Console.Write( mostFreq);
}
public static void Main(String[] args)
{
int []arr = { 4, 3, 4 };
int K = 5;
int N = arr.Length;
findMostFrequent(arr, N, K);
}
}
|
Javascript
<script>
function findMostFrequent(arr, N, K) {
let start = 0, end = 0;
arr.sort((a, b) => a - b);
let mostFreq = Number.MIN_SAFE_INTEGER, sum = 0;
for (end = 0; end < N; end++) {
sum = sum + arr[end];
while (sum + K < arr[end] * (end - start + 1)) {
sum = sum - arr[start];
start++;
}
mostFreq = Math.max(mostFreq,
end - start + 1);
}
let reqSum = arr[N - 1] * N - sum;
if (mostFreq == N && reqSum < K) {
K = K - reqSum;
if (K % N == 0) {
document.write(N + "<br>" );
}
else {
document.write(N - 1 + "<br>" );
}
return ;
}
document.write(mostFreq + "<br>" );
}
let arr = [4, 3, 4];
let K = 5;
let N = arr.length
findMostFrequent(arr, N, K);
</script>
|
Time Complexity: O(N * log N)
Auxiliary Space: O(1)
Last Updated :
18 Aug, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...