给定一个由N个整数和一个整数K组成的数组arr [] ,任务是通过将任何数组元素仅增加K一次来找到唯一元素的最大数量。
例子:
Input: arr[] = {0, 2, 4, 3, 4}, K = 1
Output: 5
Explanation:
Increase arr[2] ( = 4) by K ( = 1). Therefore, new array is {0, 2, 4, 3, 5} which has 5 unique elements.
Input: arr[] = {2, 3, 2, 4, 5, 5, 7, 4}, K = 2
Output: 7
Explanation:
Increase 4 by 2 = 6.
Increase element 7 by 2 = 9
Increase 5 by 2 = 7.
The new array is {2, 3, 2, 4, 5, 7, 9, 6} which contains 7 unique elements.
方法:解决此问题的想法是将数组中元素的频率存储在Map中,并在将任何值增加K后相应地更改数组元素以获取数组中的唯一元素。请按照以下步骤解决问题:
- 遍历数组并将每个数组元素的频率存储在Map中。
- 遍历地图并执行以下步骤:
- 如果当前元素的计数为1 ,则不要更改数组元素。
- 如果当前元素的数量大于1 ,则在Map中将当前元素的数量增加K并将(current_element + K)的数量增加1 。
- 完成上述步骤后,将Map的大小打印为数组中唯一元素的最大数量。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the maximum unique
// elements in array after incrementing
// any element by K
void maxDifferent(int arr[], int N, int K)
{
// Stores the count of element
// in array
map M;
// Traverse the array
for (int i = 0; i < N; i++) {
// Increase the counter of
// the array element by 1
M[arr[i]]++;
}
// Traverse the map
for (auto it = M.begin();
it != M.end(); it++) {
// Extract the current element
int current_element = it->first;
// Number of times the current
// element is present in array
int count = it->second;
// If element is present only
// once, then do not change it
if (count == 1)
continue;
// If the count > 1 then change
// one of the same current
// elements to (current_element + K)
// and increase its count by 1
M[current_element + K]++;
}
// The size of the map is the
// required answer
cout << M.size();
}
// Driver Code
int main()
{
int arr[] = { 2, 3, 2, 4, 5, 5, 7, 4 };
int K = 2;
int N = sizeof(arr) / sizeof(arr[0]);
// Function Call
maxDifferent(arr, N, K);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
import java.util.*;
class GFG{
// Function to find the maximum unique
// elements in array after incrementing
// any element by K
static void maxDifferent(int arr[], int N, int K)
{
// Stores the count of element
// in array
HashMap M = new HashMap();
// Traverse the array
for(int i = 0; i < N; i++)
{
// Increase the counter of
// the array element by 1
Integer count = M.get(arr[i]);
if (count == null)
{
M.put(arr[i], 1);
}
else
{
M.put(arr[i], count + 1);
}
}
// Iterator itr = M.entrySet().iterator();
Iterator> itr = M.entrySet().iterator();
int[] ar1 = new int[N];
// Traverse the map
while (itr.hasNext())
{
Map.Entry Element = itr.next();
// Extract the current element
int current_element = (int)Element.getKey();
// Number of times the current
// element is present in array
int count = (int)Element.getValue();
// If element is present only
// once, then do not change it
if (count == 1)
continue;
// If the count > 1 then change
// one of the same current
// elements to (current_element + K)
// and increase its count by 1
ar1[current_element + K]++;
}
for(int i = 0; i < N; i++)
{
if (ar1[i] >= 0)
{
Integer count = M.get(ar1[i]);
if (count == null)
{
M.put(ar1[i], 1);
}
else
{
M.put(ar1[i], count + 1);
}
}
}
// The size of the map is the
// required answer
System.out.println(M.size());
}
// Driver Code
public static void main(String[] args)
{
int arr[] = { 2, 3, 2, 4, 5, 5, 7, 4 };
int K = 2;
int N = arr.length;
// Function Call
maxDifferent(arr, N, K);
}
}
// This code is contributed by Dharanendra L V
Python3
# Python3 program for the above approach
# Function to find the maximum unique
# elements in array after incrementing
# any element by K
def maxDifferent(arr, N, K):
# Stores the count of element
# in array
M = {}
# Traverse the array
for i in range(N):
# Increase the counter of
# the array element by 1
M[arr[i]] = M.get(arr[i], 0) + 1
# Traverse the map
for it in list(M.keys()):
# Extract the current element
current_element = it
# Number of times the current
# element is present in array
count = M[it]
# If element is present only
# once, then do not change it
if (count == 1):
continue
# If the count > 1 then change
# one of the same current
# elements to (current_element + K)
# and increase its count by 1
M[current_element + K] = M.get(current_element, 0) + 1
# The size of the map is the
# required answer
print(len(M))
# Driver Code
if __name__ == '__main__':
arr=[2, 3, 2, 4, 5, 5, 7, 4]
K = 2
N = len(arr)
# Function Call
maxDifferent(arr, N, K)
# This code is contributed by mohit kumar 29
C#
// C# program for the above approach
using System;
using System.Collections.Generic;
public class GFG
{
// Function to find the maximum unique
// elements in array after incrementing
// any element by K
static void maxDifferent(int []arr, int N, int K)
{
// Stores the count of element
// in array
Dictionary M = new Dictionary();
// Traverse the array
for(int i = 0; i < N; i++)
{
// Increase the counter of
// the array element by 1
int count = M.ContainsKey(arr[i]) ? M[arr[i]] : 0;
if (count == 0)
{
M.Add(arr[i], 1);
}
else
{
M[arr[i]] = count + 1;
}
}
int[] ar1 = new int[N];
// Traverse the map
foreach(KeyValuePair Element in M)
{
// Extract the current element
int current_element = (int)Element.Key;
// Number of times the current
// element is present in array
int count = (int)Element.Value;
// If element is present only
// once, then do not change it
if (count == 1)
continue;
// If the count > 1 then change
// one of the same current
// elements to (current_element + K)
// and increase its count by 1
ar1[current_element + K]++;
}
for(int i = 0; i < N; i++)
{
if (ar1[i] >= 0)
{
int count = M.ContainsKey(ar1[i]) ? M[ar1[i]] : 0;
if (count == 0)
{
M.Add(ar1[i], 1);
}
else
{
M[ar1[i]] = count + 1;
}
}
}
// The size of the map is the
// required answer
Console.WriteLine(M.Count);
}
// Driver Code
public static void Main(String[] args)
{
int []arr = { 2, 3, 2, 4, 5, 5, 7, 4 };
int K = 2;
int N = arr.Length;
// Function Call
maxDifferent(arr, N, K);
}
}
// This code contributed by shikhasingrajput
输出:
7
时间复杂度: O(N)
辅助空间: O(N)