📌  相关文章
📜  数组中最大可能的子集,使得没有元素是子集中任何其他元素的 K 倍

📅  最后修改于: 2021-10-26 06:33:57             🧑  作者: Mango

给定一个由N 个不同整数和一个整数K组成的数组arr[] ,任务是找到可能的子集的最大大小,使得子集中没有元素是子集中任何其他元素的K倍(即没有这样的对{ n, m}应该存在于子集中,使得m = n * Kn = m * K )。

例子:

方法:
请按照以下步骤解决问题:

  • 从给定的数组中找出一个元素是另一个元素的 K 倍可能的对数
  • 按元素的递增顺序对数组进行排序。
  • 遍历数组,将数组元素的频数存入Map。
  • 初始化一个访问过的数组以标记每个索引,无论该元素是否包含( 0 ) 或不包含( 1 ) 在子集中。
  • 再次遍历数组,对于每个具有vis[i] = 0 的索引,检查arr[i] * K是否存在于Map 中。如果找到,则增加对的数量并设置vis[mp[arr[i] * K]] = 1
  • 最后,打印N – count of pair作为答案。

以下是上述方法的实现:

C++
// C++ implementation of
// the above approach
#include 
#define ll long long
using namespace std;
 
// Function to find the maximum
// size of the required subset
int findMaxLen(vector& a, ll k)
{
 
    // Size of the array
    int n = a.size();
 
    // Sort the array
    sort(a.begin(), a.end());
 
    // Stores which index is
    // included or excluded
    vector vis(n, 0);
 
    // Stores the indices of
    // array elements
    map mp;
 
    for (int i = 0; i < n; i++) {
        mp[a[i]] = i;
    }
 
    // Count of pairs
    int c = 0;
 
    // Iterate through all
    // the element
    for (int i = 0; i < n; ++i) {
 
        // If element is included
        if (vis[i] == false) {
            int check = a[i] * k;
 
            // Check if a[i] * k is present
            // in the array or not
            if (mp.find(check) != mp.end()) {
 
                // Increase count of pair
                c++;
 
                // Exclude the pair
                vis[mp[check]] = true;
            }
        }
    }
 
    return n - c;
}
 
// Driver code
int main()
{
 
    int K = 3;
    vector arr = { 1, 4, 3, 2 };
 
    cout << findMaxLen(arr, K);
}


Java
// Java implementation of
// the above approach
import java.util.*;
 
class GFG{
 
// Function to find the maximum
// size of the required subset
static int findMaxLen(int[] a, int k)
{
 
    // Size of the array
    int n = a.length;
 
    // Sort the array
    Arrays.sort(a);
 
    // Stores which index is
    // included or excluded
    boolean []vis = new boolean[n];
 
    // Stores the indices of
    // array elements
    HashMap mp = new HashMap();
                                       
    for(int i = 0; i < n; i++)
    {
        mp.put(a[i], i);
    }
 
    // Count of pairs
    int c = 0;
 
    // Iterate through all
    // the element
    for(int i = 0; i < n; ++i)
    {
 
        // If element is included
        if (vis[i] == false)
        {
            int check = a[i] * k;
 
            // Check if a[i] * k is present
            // in the array or not
            if (mp.containsKey(check))
            {
 
                // Increase count of pair
                c++;
 
                // Exclude the pair
                vis[mp.get(check)] = true;
            }
        }
    }
    return n - c;
}
 
// Driver code
public static void main(String[] args)
{
    int K = 3;
    int []arr = { 1, 4, 3, 2 };
 
    System.out.print(findMaxLen(arr, K));
}
}
 
// This code is contributed by amal kumar choubey


Python3
# Python3 implementation of
# the above approach
 
# Function to find the maximum
# size of the required subset
def findMaxLen(a, k):
 
    # Size of the array
    n = len(a)
 
    # Sort the array
    a.sort()
 
    # Stores which index is
    # included or excluded
    vis = [0] * n
 
    # Stores the indices of
    # array elements
    mp = {}
 
    for i in range(n):
        mp[a[i]] = i
 
    # Count of pairs
    c = 0
 
    # Iterate through all
    # the element
    for i in range(n):
 
        # If element is included
        if(vis[i] == False):
            check = a[i] * k
 
            # Check if a[i] * k is present
            # in the array or not
            if(check in mp.keys()):
 
                # Increase count of pair
                c += 1
 
                # Exclude the pair
                vis[mp[check]] = True
 
    return n - c
 
# Driver Code
if __name__ == '__main__':
 
    K = 3
    arr = [ 1, 4, 3, 2 ]
 
    print(findMaxLen(arr, K))
 
# This code is contributed by Shivam Singh


C#
// C# implementation of
// the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function to find the maximum
// size of the required subset
static int findMaxLen(int[] a, int k)
{
 
    // Size of the array
    int n = a.Length;
 
    // Sort the array
    Array.Sort(a);
 
    // Stores which index is
    // included or excluded
    bool []vis = new bool[n];
 
    // Stores the indices of
    // array elements
    Dictionary mp = new Dictionary();
                                     
    for(int i = 0; i < n; i++)
    {
        mp.Add(a[i], i);
    }
 
    // Count of pairs
    int c = 0;
 
    // Iterate through all
    // the element
    for(int i = 0; i < n; ++i)
    {
 
        // If element is included
        if (vis[i] == false)
        {
            int check = a[i] * k;
 
            // Check if a[i] * k is present
            // in the array or not
            if (mp.ContainsKey(check))
            {
 
                // Increase count of pair
                c++;
 
                // Exclude the pair
                vis[mp[check]] = true;
            }
        }
    }
    return n - c;
}
 
// Driver code
public static void Main(String[] args)
{
    int K = 3;
    int []arr = { 1, 4, 3, 2 };
 
    Console.Write(findMaxLen(arr, K));
}
}
 
// This code is contributed by gauravrajput1


Javascript


输出:
3

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

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程