Open In App

Construct an Array having K Subarrays with all distinct elements

Last Updated : 13 Dec, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

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)



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads