Generate an array of size N according to the given rules - GeeksforGeeks

30 Nov, 2021
Given a number N, the task is to create an array arr[] of size N, where the value of the element at every index i is filled according to the following rules:  
arr[i] = ((i – 1) – k), where k is the index of arr[i – 1] that has appeared second most recently. This rule is applied when arr[i – 1] is present more than once in the arrayarr[i] = 0. This rule is applied when arr[i – 1] is present only once or when i = 1.
arr[i] = ((i – 1) – k), where k is the index of arr[i – 1] that has appeared second most recently. This rule is applied when arr[i – 1] is present more than once in the array
arr[i] = 0. This rule is applied when arr[i – 1] is present only once or when i = 1.
Examples:  
Input: N = 8 Output: 0 0 1 0 2 0 2 2 Explanation: For i = 0: There is no element in the array arr[]. So, 0 is placed in the first index. arr[] = {0}. For i = 1: There is only one element in the array arr[]. The occurrence of arr[i – 1] (= 0) is only one. Therefore, the array is filled according to the rule 2. arr = {0, 0}. For i = 2: There are two elements in the array. The second most occurrence of arr[i – 1] = arr[0] = 0. So, arr[2] = 1. arr[] = {0, 0, 1}. For i = 3: There is no second occurrence of arr[i – 1] = 1. Therefore, arr[3] = 0. arr[] = {0, 0, 1, 0} For i = 4: The second recent occurrence of arr[i – 1] = 0 is 1. Therefore, (i – 1 – k) = (4 – 1 – 1) = 2. arr[] = {0, 0, 1, 0, 2}. For i = 5: There is only one occurrence of arr[i – 1] = 2. Therefore, arr[5] = 0. arr[] = {0, 0, 1, 0, 2, 0}. For i = 6: The second recent occurrence of arr[i – 1] = 0 is 3. Therefore, (i – 1 – k) = (6 – 1 – 3) = 2. arr[] = {0, 0, 1, 0, 2, 0, 2}. For i = 7: The second recent occurrence of arr[i – 1] = 2 is 4. Therefore, (i – 1 – k) = (7 – 1 – 4) = 2. arr[] = {0, 0, 1, 0, 2, 0, 2, 2}Input: N = 5 Output: 0 0 1 0 2  
 
Approach: The idea is to first create an array filled with zeroes of size N. Then for every iteration, we search if the element has occurred in the near past. If yes, then we follow rule 1. Else, rule 2 is followed to fill the array. Below is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// C++ implementation to generate// an array of size N by following// the given rules#include <bits/stdc++.h>using namespace std; // Function to search the most recent// location of element N// If not present in the array// it will return -1int search(int a[], int k, int x){    int j;         for ( j = k - 1; j > -1 ; j--)    {        if(a[j] == x)            return j ;    }                         return -1 ;} // Function to generate an array// of size N by following the given rulesvoid genArray(int arr[], int N){     // Loop to fill the array    // as per the given rules    for(int i = 0; i < N - 1; i++)    {         // Check for the occurrence        // of arr[i - 1]        if(search(arr, i, arr[i]) == -1)                arr[i + 1] = 0 ;         else            arr[i + 1] = (i-search(arr, i, arr[i])) ;    }} // Driver codeint main(){    int N = 5 ;    int size = N + 1 ;    int a[] = {0, 0, 0, 0, 0};    genArray(a, N) ;         for (int i = 0; i < N ; i ++)        cout << a[i] << " " ;        return 0;}  // This code is contributed by shivanisinghss2110
// Java implementation to generate// an array of size N by following// the given rulesclass GFG{ static int a[]; // Function to search the most recent// location of element N// If not present in the array// it will return -1static int search(int a[],int k, int x){    int j;         for ( j = k - 1; j > -1 ; j--)    {            if(a[j] == x)                return j ;        }                         return -1 ;} // Function to generate an array// of size N by following the given rulesstatic void genArray(int []arr, int N){     // Loop to fill the array    // as per the given rules    for(int i = 0; i < N - 1; i++)    {         // Check for the occurrence        // of arr[i - 1]        if(search(arr, i, arr[i]) == -1)                arr[i + 1] = 0 ;         else            arr[i + 1] = (i-search(arr, i, arr[i])) ;    }} // Driver codepublic static void main (String[] args){    int N = 5 ;    int size = N + 1 ;    int a[] = new int [N];    genArray(a, N) ;         for (int i = 0; i < N ; i ++)        System.out.print(a[i]+" " ); }} // This code is contributed by Yash_R
# Python implementation to generate# an array of size N by following# the given rules  # Function to search the most recent# location of element N# If not present in the array# it will return -1def search(a, k, x):        for j in range(k-1, -1, -1) :            if(a[j]== x):                return j                         return -1 # Function to generate an array# of size N by following the given rulesdef genArray(arr, N):     # Loop to fill the array    # as per the given rules    for i in range(0, N-1, 1):         # Check for the occurrence        # of arr[i - 1]        if(search(arr, i, arr[i])==-1):                arr[i + 1]= 0         else:            arr[i + 1]=(i-search(arr, i, arr[i]))             # Driver code     if __name__ == "__main__":    N = 5    size = N + 1    a =[0]*N    genArray(a, N)         print(a)
// C# implementation to generate// an array of size N by following// the given rules using System; public class GFG{ static int []a; // Function to search the most recent// location of element N// If not present in the array// it will return -1static int search(int []a,int k, int x){    int j;         for ( j = k - 1; j > -1 ; j--)    {            if(a[j] == x)                return j ;        }                         return -1 ;} // Function to generate an array// of size N by following the given rulesstatic void genArray(int []arr, int N){     // Loop to fill the array    // as per the given rules    for(int i = 0; i < N - 1; i++)    {         // Check for the occurrence        // of arr[i - 1]        if(search(arr, i, arr[i]) == -1)                arr[i + 1] = 0 ;         else            arr[i + 1] = (i-search(arr, i, arr[i])) ;    }} // Driver codepublic static void Main (string[] args){    int N = 5 ;    int size = N + 1 ;    int []a = new int [N];    genArray(a, N) ;         for (int i = 0; i < N ; i ++)        Console.Write(a[i]+" " ); }}// This code is contributed by AnkitRai01
<script> // Javascript implementation to generate// an array of size N by following// the given rules // Function to search the most recent// location of element N// If not present in the array// it will return -1function search( a, k, x){    var j;         for ( j = k - 1; j > -1 ; j--)    {        if(a[j] == x)            return j ;    }                         return -1 ;} // Function to generate an array// of size N by following the given rulesfunction genArray(arr, N){     // Loop to fill the array    // as per the given rules    for(var i = 0; i < N - 1; i++)    {         // Check for the occurrence        // of arr[i - 1]        if(search(arr, i, arr[i]) == -1)                arr[i + 1] = 0 ;         else            arr[i + 1] = (i-search(arr, i, arr[i])) ;    }} // Driver codevar N = 5 ;var size = N + 1 ;var a = [0, 0, 0, 0, 0];genArray(a, N) ;document.write("["+a+"]"); // This code is contributed by rutvik_56.</script>
[0, 0, 1, 0, 2]
 
Time Complexity: O(N2)
Auxiliary Space: O(1)
Yash_R
ankthon
shivanisinghss2110
rutvik_56
souravmahato348
Arrays
Mathematical
School Programming
Arrays
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Window Sliding Technique
Trapping Rain Water
Reversal algorithm for array rotation
Move all negative numbers to beginning and positive to end with constant extra space
Program to find sum of elements in a given array
Program for Fibonacci numbers
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7