Largest possible Subset from an Array such that no element is K times any other element in the Subset

Given an array arr[] consisting of N distinct integers and an integer K, the task is to find the maximum size of a subset possible such that no element in the subset is K times any other element of the subset(i.e. no such pair {n, m} should be present in the subset such that either m = n * K or n = m * K).

Examples: 

Input: arr[] = {2, 8, 6, 5, 3}, K = 2 
Output:
Explanation: 
Only possible pair existing in the array with an element being K( = 2) times the other is {6, 3}. 
Hence, all possible subsets which does not contain both the elements of the pair {6, 3} together can be considered. 
Therefore, the longest possible subset can be of length 4.

Input: arr[] = {1, 4, 3, 2}, K = 3 
output:
 

Approach: 
Follow the steps below to solve the problem: 



Below is implementation of above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of
// the above aproach
#include <bits/stdc++.h>
#define ll long long
using namespace std;
  
// Function to find the maximum
// size of the required subset
int findMaxLen(vector<ll>& 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<bool> vis(n, 0);
  
    // Stores the indices of
    // array elements
    map<int, int> 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<ll> arr = { 1, 4, 3, 2 };
  
    cout << findMaxLen(arr, K);
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of
// the above aproach
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<Integer,
            Integer> mp = new HashMap<Integer,
                                      Integer>();
                                        
    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 
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of
// the above aproach
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<int,
               int> mp = new Dictionary<int,
                                        int>();
                                      
    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
chevron_right

Output: 
3

Time Complexity: O(N) 
Auxiliary Space: O(N)
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




Recommended Posts:


Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Article Tags :