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: 
 

  • Find the number of pairs possible such that one element is K times the other from the given array
  • Sort the array in increasing order of elements.
  • Traverse the array and store the frequenciindices of array elements in Map.
  • Initialize an array visited to mark for every index, whether that element is included(0) or not(1) in the subset.
  • Traverse the array again and for every index having vis[i] = 0, check if arr[i] * K is present in the Map or not. If found, then increase the count of pairs and set vis[mp[arr[i] * K]] = 1.
  • Finally, print N – count of pairs as the answer. 
     

Below is implementation of above approach:
 



C++

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


Python3

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


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.




My Personal Notes arrow_drop_up

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.



Improved By : SHIVAMSINGH67