📌  相关文章
📜  计算将数组拆分为K个不相交的子集的方法

📅  最后修改于: 2021-05-04 11:46:53             🧑  作者: Mango

给定大小为N且整数K的数组arr [] ,任务是将数组拆分为K个不相交的子集,以使所有K个子集的并集等于给定的数组。

例子:

方法:可根据以下观察结果解决问题:

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

  • 计算不同的元素,例如给定数组中存在M。
  • 打印功率值(K,M)。

下面是上述方法的实现:

C++
// C++ program to implement
// the above approach
 
#include 
using namespace std;
 
// Function to get
// the value of pow(K, M)
int power(int K, int M)
{
    // Stores value of pow(K, M)
    int res = 1;
 
    // Calculate value of pow(K, N)
    while (M > 0) {
 
        // If N is odd, update
        // res
        if ((M & 1) == 1) {
            res = (res * K);
        }
 
        // Update M to M / 2
        M = M >> 1;
 
        // Update K
        K = (K * K);
    }
    return res;
}
 
// Function to print total ways
// to split the array that
// satisfies the given condition
int cntWays(int arr[], int N,
            int K)
{
    // Stores total ways that
    // satisfies the given
    // condition
    int cntways = 0;
 
    // Stores count of distinct
    // elements in the given arr
    int M = 0;
 
    // Store distinct elements
    // of the given array
    unordered_set st;
 
    // Traverse the given array
    for (int i = 0; i < N; i++) {
 
        // Insert current element
        // into set st.
        st.insert(arr[i]);
    }
 
    // Update M
    M = st.size();
 
    // Update cntways
    cntways = power(K, M);
 
    return cntways;
}
 
// Driver Code
int main()
{
 
    int arr[] = { 2, 3 };
    int N = sizeof(arr) / sizeof(arr[0]);
    int K = 2;
    cout << cntWays(arr, N, K);
    return 0;
}


Java
// Java program to implement
// the above approach
import java.io.*;
import java.util.*;
 
class GFG{
     
// Function to get
// the value of pow(K, M)
static int power(int K, int M)
{
     
    // Stores value of pow(K, M)
    int res = 1;
  
    // Calculate value of pow(K, N)
    while (M > 0)
    {
         
        // If N is odd, update
        // res
        if ((M & 1) == 1)
        {
            res = (res * K);
        }
  
        // Update M to M / 2
        M = M >> 1;
  
        // Update K
        K = (K * K);
    }
    return res;
}
  
// Function to print total ways
// to split the array that
// satisfies the given condition
static int cntWays(int arr[], int N,
                   int K)
{
     
    // Stores total ways that
    // satisfies the given
    // condition
    int cntways = 0;
  
    // Stores count of distinct
    // elements in the given arr
    int M = 0;
  
    // Store distinct elements
    // of the given array
    Set st = new HashSet(); 
     
    // Traverse the given array
    for(int i = 0; i < N; i++)
    {
  
        // Insert current element
        // into set st.
        st.add(arr[i]);
    }
  
    // Update M
    M = st.size();
  
    // Update cntways
    cntways = power(K, M);
  
    return cntways;
}
  
// Driver Code
public static void main (String[] args)
{
    int arr[] = { 2, 3 };
    int N = arr.length;
    int K = 2;
     
    System.out.println(cntWays(arr, N, K));
}
}
 
// This code is contributed by sanjoy_62


Python3
# Python3 program to implement
# the above approach
 
# Function to get
# the value of pow(K, M)
def power(K, M):
 
    # Stores value of pow(K, M)
    res = 1
 
    # Calculate value of pow(K, N)
    while (M > 0):
 
        # If N is odd, update
        # res
        if ((M & 1) == 1):
            res = (res * K)
 
        # Update M to M / 2
        M = M >> 1
 
        # Update K
        K = (K * K)
    
    return res
 
# Function to print total ways
# to split the array that
# satisfies the given condition
def cntWays(arr, N, K):
     
    # Stores total ways that
    # satisfies the given
    # condition
    cntways = 0
 
    # Stores count of distinct
    # elements in the given arr
    M = 0
 
    # Store distinct elements
    # of the given array
    st = set()
 
    # Traverse the given array
    for i in range(N):
         
        # Insert current element
        # into set st.
        st.add(arr[i])
    
    # Update M
    M = len(st)
 
    # Update cntways
    cntways = power(K, M)
 
    return cntways
 
# Driver Code
if __name__ == '__main__':
  
    arr = [ 2, 3 ]
    N = len(arr)
    K = 2
      
    print(cntWays(arr, N, K))
 
# This code is contributed by math_lover


C#
// C# program to implement
// the above approach 
using System;
using System.Collections.Generic;
 
class GFG{
      
// Function to get
// the value of pow(K, M)
static int power(int K, int M)
{
     
    // Stores value of pow(K, M)
    int res = 1;
   
    // Calculate value of pow(K, N)
    while (M > 0)
    {
         
        // If N is odd, update
        // res
        if ((M & 1) == 1)
        {
            res = (res * K);
        }
   
        // Update M to M / 2
        M = M >> 1;
   
        // Update K
        K = (K * K);
    }
    return res;
}
   
// Function to print total ways
// to split the array that
// satisfies the given condition
static int cntWays(int[] arr, int N,
                   int K)
{
     
    // Stores total ways that
    // satisfies the given
    // condition
    int cntways = 0;
   
    // Stores count of distinct
    // elements in the given arr
    int M = 0;
   
    // Store distinct elements
    // of the given array
    HashSet st = new HashSet();
     
    // Traverse the given array
    for(int i = 0; i < N; i++)
    {
         
        // Insert current element
        // into set st.
        st.Add(arr[i]);
    }
   
    // Update M
    M = st.Count;
   
    // Update cntways
    cntways = power(K, M);
   
    return cntways;
}
  
// Driver code
public static void Main()
{
    int[] arr = { 2, 3 };
    int N = arr.Length;
    int K = 2;
      
    Console.WriteLine(cntWays(arr, N, K));
}
}
 
// This code is contributed by code_hunt


输出:
4











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