Wednesday, July 3, 2024
HomeData ModellingData Structure & AlgorithmConstruct an Array having K Subarrays with all distinct elements

Construct an Array having K Subarrays with all distinct elements

Given integers N and K, the task is to construct an array arr[] of size N using numbers in the range [1, N] such that it has K sub-arrays whose all the elements are distinct.

Note: If there are multiple possible answers return any of them.

Examples:

Input: N = 5, K = 8
Output: {1, 2, 3, 3, 3}
Explanation: This array has the distinct sub-arrays as {1}, {2}, {3}, {3}, {3}, {1, 2}, {2, 3}, {1, 2, 3}

Input: N = 6, K = 21
Output: {1, 2, 3, 4, 5, 6}
Explanation: This array has the 21 distinct sub-arrays.

Approach: The idea to solve the problem is based on the following mathematical observation:

  • N elements will definitely form N subarrays of size 1 having unique elements.
  • Now the remaining task is to form array such that (N-K subarrays) of size more than 1 have all distinct elements.
  • Also it is known number of subarrays of size more than 1 from X elements are (X*(X+1))/2 – X = X*(X-1)/2
  • If X elements are distinct all these subarrays have all distinct elements. 

So to form the array there is a need for such X distinct elements such that X*(X-1)/2 = K-N.
So in each step, add a distinct element until the above condition is satisfied. After that repeat the last element till the array size becomes N (because if the last element is repeated it will not effect count of subarrays with all distinct elements).

Follow these steps to solve the problem:

  • Decrement K by K – N because every integer contributes to a distinct subarray of size 1.
  • Now Initialize a variable num = 0 to keep track of integers that are being added to the array and the number of subarrays formed.
  • From K, decrement the number of distinct subarrays formed after adding (num + 1) to the new array. (till num <= K).
  • Check if array size has reached N. If not add the num – K repeated times till the array fills.

Below is the implementation for the above approach:

C++




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to construct the array
// with k distinct subarrays
vector<int> construct_array(int n, int k)
{
 
    // Each individual integers
    // contributes to one subarray
    k = k - n;
 
    // Initialize a variable to keep
    // track of integers that are
    // adding to the array
    int num = 0;
 
    // Initialize the res to
    // store the array
    vector<int> res;
 
    // Push as many possible distinct
    // integers into the vector
    while (k >= num) {
        res.push_back(num + 1);
 
        // Decrement the count of
        // distinct subarrays incrementing
        k -= num;
        num++;
    }
    // If still it is not possible to
    // get the array of size n then
    // adding n-k at the end make num-k
    // more distinct subarrays
    while (res.size() < n) {
        res.push_back(num - k);
    }
 
    // Return the array
    return res;
}
 
// Driver code
int main()
{
    int N = 5;
    int K = 8;
 
    // Function call
    vector<int> ans = construct_array(N, K);
    for (int x : ans)
        cout << x << " ";
    return 0;
}


Java




// JAVA program for the above approach
import java.util.*;
class GFG {
 
  // Function to construct the array
  // with k distinct subarrays
  public static ArrayList<Integer> construct_array(int n,
                                                   int k)
  {
 
    // Each individual integers
    // contributes to one subarray
    k = k - n;
 
    // Initialize a variable to keep
    // track of integers that are
    // adding to the array
    int num = 0;
 
    // Initialize the res to
    // store the array
    ArrayList<Integer> res = new ArrayList<Integer>();
 
    // Push as many possible distinct
    // integers into the vector
    while (k >= num) {
      res.add(num + 1);
 
      // Decrement the count of
      // distinct subarrays incrementing
      k -= num;
      num++;
    }
    // If still it is not possible to
    // get the array of size n then
    // adding n-k at the end make num-k
    // more distinct subarrays
    while (res.size() < n) {
      res.add(num - k);
    }
 
    // Return the array
    return res;
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int N = 5;
    int K = 8;
 
    // Function call
    ArrayList<Integer> ans = construct_array(N, K);
    for (int x = 0; x < ans.size(); x++)
      System.out.print(ans.get(x) + " ");
  }
}
 
// This code is contributed by Taranpreet


Python3




# Python3 code to implement the approach
 
# Function to construct the array
# with k distinct subarrays
def construct_array(n, k):
 
    # Each individual integers
    # contributes to one subarray
    k -= n
 
    # // Initialize a variable to keep
    # track of integers that are
    # adding to the array
    num = 0
 
    # Initialize the res to
    # store the array
    res = []
 
    # Push as many possible distinct
    # integers into the vector
    while k >= num:
        res.append(num + 1)
 
        # Decrement the count of
        # distinct subarrays incrementing
        k -= num
        num += 1
 
    # If still it is not possible to
    # get the array of size n then
    # adding n-k at the end make num-k
    # more distinct subarrays
    while len(res) < n:
        res.append(num - k)
 
    return res
 
# Driver code
N = 5
K = 8
 
# function call
ans = construct_array(N, K)
print(" ".join(list(map(str, ans))))
 
# This code is contributed by phasing17


C#




// C# program for the above approach
using System;
using System.Collections;
 
public class GFG{
 
  // Function to construct the array
  // with k distinct subarrays
  public static ArrayList construct_array(int n,
                                          int k)
  {
 
    // Each individual integers
    // contributes to one subarray
    k = k - n;
 
    // Initialize a variable to keep
    // track of integers that are
    // adding to the array
    int num = 0;
 
    // Initialize the res to
    // store the array
    ArrayList res = new ArrayList();
 
    // Push as many possible distinct
    // integers into the vector
    while (k >= num) {
      res.Add(num + 1);
 
      // Decrement the count of
      // distinct subarrays incrementing
      k -= num;
      num++;
    }
    // If still it is not possible to
    // get the array of size n then
    // adding n-k at the end make num-k
    // more distinct subarrays
    while (res.Count < n) {
      res.Add(num - k);
    }
 
    // Return the array
    return res;
  }
 
  // Driver code
  static public void Main (){
 
    int N = 5;
    int K = 8;
 
    // Function call
    ArrayList ans = construct_array(N, K);
    foreach(int x in ans)
      Console.Write(x + " ");
  }
}
 
// This code is contributed by hrithikgarg03188.


Javascript




<script>
    // JavaScript program for the above approach
 
    // Function to construct the array
    // with k distinct subarrays
    const construct_array = (n, k) => {
 
        // Each individual integers
        // contributes to one subarray
        k = k - n;
 
        // Initialize a variable to keep
        // track of integers that are
        // adding to the array
        let num = 0;
 
        // Initialize the res to
        // store the array
        let res = [];
 
        // Push as many possible distinct
        // integers into the vector
        while (k >= num) {
            res.push(num + 1);
 
            // Decrement the count of
            // distinct subarrays incrementing
            k -= num;
            num++;
        }
        // If still it is not possible to
        // get the array of size n then
        // adding n-k at the end make num-k
        // more distinct subarrays
        while (res.length < n) {
            res.push(num - k);
        }
 
        // Return the array
        return res;
    }
 
    // Driver code
 
    let N = 5;
    let K = 8;
 
    // Function call
    let ans = construct_array(N, K);
    for (let x in ans)
        document.write(`${ans[x]} `);
 
// This code is contributed by rakeshsahni
 
</script>


Output

1 2 3 3 3 

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

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Last Updated :
13 Dec, 2022
Like Article
Save Article


Previous

<!–

8 Min Read | Java

–>


Next


<!–

8 Min Read | Java

–>

Thapelo Manthata
I’m a desktop support specialist transitioning into a SharePoint developer role by day and Software Engineering student by night. My superpowers include customer service, coding, the Microsoft office 365 suite including SharePoint and power platform.
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments