📜  最大差异为 1 的最大子集

📅  最后修改于: 2022-05-13 01:57:53.073000             🧑  作者: Mango

最大差异为 1 的最大子集

给定一个包含n 个正整数的数组arr[] 。任务是找到由给定数组的元素组成的子集的大小,并且该集合的任意两个元素之间的绝对差小于等于 1。
例子 :

Input : arr[] = {8, 9, 8, 7, 8, 9, 10, 11}
Output : 5
If we make subset with elements {8, 9, 8, 8, 9}. 
Each pair in the subset has an absolute 
difference <= 1 

Input : arr[] = {4, 5, 2, 4, 4, 4}
Output : 5
Subset is {4, 5, 4, 4, 4}

请注意,由于我们希望任何两个元素之间的绝对差小于等于 1,因此最多可以有两个不同的数字。因此,我们选择的子集将采用 {a, a, a, ....., b, b, b} 或 {a, a, a, a, .....} 的形式。
现在,要找到这样的子集的大小,我们将找到每个元素的频率,例如 c 1 、 c 2 、 c 3 、 ....、 c j 、 ....、 c在 arr 中的最大元素。那么我们的答案将是 c i + c i+1的最大值。
下面是这种方法的实现:

C++
// CPP Program to find the size of
// the subset formed from the elements
// of the given array such that the
// maximum difference is 1
#include 
using namespace std;
 
// Return the maximum size of subset with
// absolute difference between any element
// is less than 1.
int maxsizeSubset(int arr[], int n)
{
    // Inserting elements and their
    // frequencies in a hash table.
    unordered_map mp;
    for (int i = 0; i < n; i++)
        mp[arr[i]]++;
 
    // Traverse through map, for every element
    // x in map, find if x+1 also exists in map.
    // If exists, see if sum of their frequencies
    // is more than current result.
    int res = 0;
    for (auto x : mp)
    if (mp.find(x.first + 1) != mp.end())
    {
        res = max(res, mp[x.first] + mp[x.first+1]);
    }
    else
    {
        res=max(res,mp[x.first]);
    }
    return res;
}
 
// Driven Program
int main()
{
    int arr[] = {1, 2, 2, 3, 1, 2};
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << maxsizeSubset(arr, n) << endl;
    return 0;
}


Java
// Java Program to find the size of
// the subset formed from the elements
// of the given array such that the
// maximum difference is 1
import java.util.*;
 
class GFG
{
 
    // Return the maximum size of subset with
    // absolute difference between any element
    // is less than 1.
    static int maxsizeSubset(int arr[], int n)
    {
        // Inserting elements and their
        // frequencies in a hash table.
        Map mp = new HashMap<>();
        for (int i = 0; i < n; i++)
        {
            if (mp.containsKey(arr[i]))
            {
                mp.put(arr[i], mp.get(arr[i]) + 1);
            }
            else
            {
                mp.put(arr[i], 1);
            }
        }
 
        // Traverse through map, for every element
        // x in map, find if x+1 also exists in map.
        // If exists, see if sum of their frequencies
        // is more than current result.
        int res = 0;
        for (Map.Entry x : mp.entrySet())
        {
            if (mp.containsKey(x.getKey() + 1))
            {
                res = Math.max(res, mp.get(x.getKey()) + mp.get(x.getKey() + 1));
            }
            else
            {
                res = Math.max(res, mp.get(x.getKey()));
            }
        }
        return res;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = {1, 2, 2, 3, 1, 2};
        int n = arr.length;
        System.out.println(maxsizeSubset(arr, n));
    }
}
 
/* This code is contributed by PrinciRaj1992 */


C#
// C# Program to find the size of
// the subset formed from the elements
// of the given array such that the
// maximum difference is 1
using System;
using System.Collections.Generic;
 
class GFG
{
 
    // Return the maximum size of subset with
    // absolute difference between any element
    // is less than 1.
    static int maxsizeSubset(int []arr, int n)
    {
        // Inserting elements and their
        // frequencies in a hash table.
        Dictionary mp = new Dictionary();
        for (int i = 0 ; i < n; i++)
        {
            if(mp.ContainsKey(arr[i]))
            {
                var val = mp[arr[i]];
                mp.Remove(arr[i]);
                mp.Add(arr[i], val + 1);
            }
            else
            {
                mp.Add(arr[i], 1);
            }
        }
 
        // Traverse through map, for every element
        // x in map, find if x+1 also exists in map.
        // If exists, see if sum of their frequencies
        // is more than current result.
        int res = 0;
        foreach(KeyValuePair x in mp)
        {
            if (mp.ContainsKey(x.Key + 1))
            {
                res = Math.Max(res, mp[x.Key] + mp[x.Key + 1]);
            }
            else
            {
                res = Math.Max(res, mp[x.Key]);
            }
        }
        return res;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int []arr = {1, 2, 2, 3, 1, 2};
        int n = arr.Length;
        Console.WriteLine(maxsizeSubset(arr, n));
    }
}
 
// This code is contributed by 29AjayKumar


Javascript


输出:
5

时间复杂度: O(n)
辅助空间: O(n)