Skip to content
Related Articles

Related Articles

Find Array after removing -1 and closest non-negative left element

Improve Article
Save Article
  • Difficulty Level : Medium
  • Last Updated : 25 Oct, 2022
Improve Article
Save Article

Given an array arr[] of size N that contains -1 and all positive integers, the task is to modify the array and print the final array after performing the below valid operations:

  • Choose -1 from the array.
  • Remove the closest non-negative element (if there is any) to its left, as well as remove -1 itself.

Examples:

Input: arr[] = {1, 2, 3, -1, -1, 4, 5, 6, -1, 0}
Output: 1 4 5 0
Explanation: The closest element to the 1st occurrence of -1 is 3 in {1, 2, 3, -1, -1, 4, 5, 6, -1, 0}. After removing -1 and 3 arr becomes {, 2, -1, 4, 5, 6, -1, 0}.
The closest element to the 1st occurrence of -1 is 2 in {1, 2, -1, 4, 5, 6, -1, 0}. After removing -1 and 2 arr becomes {1, 4, 5, 6, -1, 0}.
The closest element to the 1st occurrence of -1 is 6 in {1, 4, 5, 6, -1, 0}. After removing -1 and 6 arr becomes {1, 4, 5, 0}.

Input: arr[] = {-1, 0, 1, -1, 10}
Output: 0 10
Explanation:There is no element exist closest in right of first occurrence of -1 in {-1, 0, 1, -1, 10}. So we will only remove -1. After removing -1 arr becomes {0, 1, -1, 10}.
The closest element to the 1st occurrence of -1 is 1 in {0, 1, -1, 10}. After removing -1 and 1 arr becomes  {0, 10}

Naive Approach: The basic way to solve the problem is as follows: 

  • Traverse on the array from left to right
  • Find the first occurrence of -1 and make it -10
  • If -1 is found then traverse on the left part and find the first non-negative integer and make it -10.
  • Again traverse the array to the right from where we got the first occurrence of -1 and again repeat the above two steps.

Below is the implementation for the above approach:

C++




// C++ code for the above approach:
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to remove -1 and
// corresponding left
void removeBadElements(int arr[], int n)
{
 
    // Traversing from left to right
    for (int i = 0; i < n; i++) {
 
        // If -1 occurs
        if (arr[i] == -1) {
 
            // Make -1 to -10 for
            // printing purpose
            arr[i] = -10;
 
            // Traverse form right to left
            // to get first non-negative
            // element
            for (int j = i - 1; j >= 0; j--) {
                if (arr[j] >= 0) {
                    arr[j] = -10;
                    break;
                }
            }
        }
    }
 
    // Printing array elements
    for (int i = 0; i < n; i++)
        if (arr[i] != -10)
            cout << arr[i] << " ";
}
 
// Driver code
int main()
{
    int arr[] = { 1, 2, 3, -1, -1, 4, 5, 6, -1, 0 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    removeBadElements(arr, N);
    return 0;
}


Java




// Java code for the above approach:
import java.util.*;
 
class GFG{
 
  // Function to remove -1 and
  // corresponding left
  static void removeBadElements(int arr[], int n)
  {
 
    // Traversing from left to right
    for (int i = 0; i < n; i++) {
 
      // If -1 occurs
      if (arr[i] == -1) {
 
        // Make -1 to -10 for
        // printing purpose
        arr[i] = -10;
 
        // Traverse form right to left
        // to get first non-negative
        // element
        for (int j = i - 1; j >= 0; j--) {
          if (arr[j] >= 0) {
            arr[j] = -10;
            break;
          }
        }
      }
    }
 
    // Printing array elements
    for (int i = 0; i < n; i++)
      if (arr[i] != -10)
        System.out.print(arr[i]+ " ");
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int arr[] = { 1, 2, 3, -1, -1, 4, 5, 6, -1, 0 };
    int N = arr.length;
 
    // Function Call
    removeBadElements(arr, N);
  }
}
 
// This code is contributed by shikhasingrajput


Python3




# Python code for the above approach:
 
# Function to remove -1 and corresponding left
def removeBadElements(arr, n):
   
    # Traversing from left to right
    for i in range(n):
       
        # If -1 occurs
        if arr[i] is -1:
           
            # Make -1 to -10 for printing purpose
            arr[i] = -10
 
            # Traverse form right to left to get first non-negative element
            for j in range(i - 1, 0, -1):
                if arr[j] >= 0:
                    arr[j] = -10
                    break
 
    # Printing array elements
    for i in range(n):
        if arr[i] is not -10:
            print(arr[i], end=" ")
 
arr = [1, 2, 3, -1, -1, 4, 5, 6, -1, 0]
N = len(arr)
 
# Function call
removeBadElements(arr, N)
 
# This code is contributed by lokeshmvs21


C#




// C# code for the above approach
using System;
 
public class GFG {
    // Function to remove -1 and
    // corresponding left
    static void removeBadElements(int[] arr, int n)
    {
        // Traversing from left to right
        for (int i = 0; i < n; i++) {
            // If -1 occurs
            if (arr[i] == -1) {
 
                // Make -1 to -10 for
                // printing purpose
                arr[i] = -10;
 
                // Traverse form right to left
                // to get first non-negative
                // element
                for (int j = i - 1; j >= 0; j--) {
                    if (arr[j] >= 0) {
                        arr[j] = -10;
                        break;
                    }
                }
            }
        }
 
        // Printing array elements
        for (int i = 0; i < n; i++)
            if (arr[i] != -10)
                Console.Write(arr[i] + " ");
    }
 
    // Driver code
    static void Main()
    {
        int[] arr = { 1, 2, 3, -1, -1, 4, 5, 6, -1, 0 };
        int N = arr.Length;
 
        // Function Call
        removeBadElements(arr, N);
    }
}
 
// This code is contributed by Rohit Pradhan


Javascript




// JavaScript code for the above approach:
 
// Function to remove -1 and
// corresponding left
function removeBadElements(arr, n)
{
 
  // Traversing from left to right
  for (let i = 0; i < n; i++)
  {
   
    // If -1 occurs
    if (arr[i] == -1)
    {
     
      // Make -1 to -10 for
      // printing purpose
      arr[i] = -10;
 
      // Traverse form right to left
      // to get first non-negative
      // element
      for (let j = i - 1; j >= 0; j--) {
        if (arr[j] >= 0) {
          arr[j] = -10;
          break;
        }
      }
    }
  }
  let ans = [];
   
  // Printing array elements
  for (let i = 0; i < n; i++) if (arr[i] != -10) ans.push(arr[i]);
  console.log(ans);
}
 
// Driver code
let arr = [1, 2, 3, -1, -1, 4, 5, 6, -1, 0];
let N = arr.length;
 
// Function Call
removeBadElements(arr, N);
 
// This code is contributed by ishankhandelwals.


Output

1 4 5 0 

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

Efficient Approach: The idea to solve the problem is as follows:

Traverse the array from right to left. Store the count of -1 as on traversing from right to left on the array as well as if -1 encounters then we will make it as -10(for printing purposes after doing all operations). If we encounter a positive integer and if the count of -1 is greater than 0 then initialize the current element to -10 and we will decrement the count of -1 by 1. Likewise traverse the complete array.

Follow the steps to solve the problem:

  • Create a variable bad_count = 0, to store occurrence of -1 in array
  • Traverse on the array from right to left
  • If -1 occurs then increment bad_count and initialize the element to -10.
  • If -1 is not occurring but still bad_count is greater than 0 then initialize the element to -10 and decrement bad_count.
  • Repeat the above 2 steps until we traverse the complete array.

Below is the implementation of the above approach.

C++




// C++ code for the above approach:
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the final state of the array
void removeBadElements(int arr[], int n)
{
    // To count -1
    int bad_count = 0;
 
    // Traversing from right to left
    for (int i = n - 1; i >= 0; i--) {
 
        // If -1 occurs increment
        // bad count
        if (arr[i] == -1) {
            bad_count++;
 
            // Initialize to -10 for
            // printing purpose
            arr[i] = -10;
        }
 
        // If element is not -1 but bad_
        // count on right is more
        // then also initialize element
        // to -10
        else if (bad_count > 0) {
            arr[i] = -10;
            bad_count--;
        }
    }
 
    for (int i = 0; i < n; i++)
        if (arr[i] != -10) {
            cout << arr[i] << " ";
        }
}
 
// Driver code
int main()
{
    int arr[] = { 1, 2, 3, -1, -1, 4, 5, 6, -1, 0 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function call
    removeBadElements(arr, N);
    return 0;
}


Java




// Java program for the above approach
import java.io.*;
import java.util.*;
 
class GFG {
 
// Function to find the final state of the array
static void removeBadElements(int arr[], int n)
{
    // To count -1
    int bad_count = 0;
 
    // Traversing from right to left
    for (int i = n - 1; i >= 0; i--) {
 
        // If -1 occurs increment
        // bad count
        if (arr[i] == -1) {
            bad_count++;
 
            // Initialize to -10 for
            // printing purpose
            arr[i] = -10;
        }
 
        // If element is not -1 but bad_
        // count on right is more
        // then also initialize element
        // to -10
        else if (bad_count > 0) {
            arr[i] = -10;
            bad_count--;
        }
    }
 
    for (int i = 0; i < n; i++)
        if (arr[i] != -10) {
            System.out.print(arr[i] + " ");
        }
}
     
public static void main(String[] args)
{
    int arr[] = { 1, 2, 3, -1, -1, 4, 5, 6, -1, 0 };
    int N = arr.length;
 
    // Function call
    removeBadElements(arr, N);
}
}
 
// This code is contributed by sanjoy_62.


Python3




# Python code for the above approach
 
# Function to find the final state of the array
def removeBadElements(arr, n):
   
    # To count -1
    bad_count = 0
 
    # Traversing from right to left
    for i in range(n-1, -1, -1):
       
        # If -1 occurs increment bad count
        if(arr[i] == -1):
            bad_count += 1
 
            # Initialize to -10 for printing purpose
            arr[i] = -10
 
        # If element is not -1 but bad_count on right is
        # more then also initialize element to -10
        elif(bad_count > 0):
            arr[i] = -10
            bad_count -= 1
 
    for i in range(n):
        if(arr[i] != -10):
            print(arr[i], end=" ")
 
 
arr = [1, 2, 3, -1, -1, 4, 5, 6, -1, 0]
N = len(arr)
 
# Function call
removeBadElements(arr, N)
 
# This code is contributed by lokeshmvs21.


C#




// C# code to implement the approach
using System;
 
class GFG
{
 
  // Function to find the final state of the array
  static void removeBadElements(int[] arr, int n)
  {
    // To count -1
    int bad_count = 0;
 
    // Traversing from right to left
    for (int i = n - 1; i >= 0; i--) {
 
      // If -1 occurs increment
      // bad count
      if (arr[i] == -1) {
        bad_count++;
 
        // Initialize to -10 for
        // printing purpose
        arr[i] = -10;
      }
 
      // If element is not -1 but bad_
      // count on right is more
      // then also initialize element
      // to -10
      else if (bad_count > 0) {
        arr[i] = -10;
        bad_count--;
      }
    }
 
    for (int i = 0; i < n; i++)
      if (arr[i] != -10) {
        Console.Write(arr[i] + " ");
      }
  }
 
  // Driver Code
  public static void Main()
  {
    int[] arr = { 1, 2, 3, -1, -1, 4, 5, 6, -1, 0 };
    int N = arr.Length;
 
    // Function call
    removeBadElements(arr, N);
  }
}
 
// This code is contributed by code_hunt.


Javascript




<script>
    // JavaScript code for the above approach:
 
 
    // Function to find the final state of the array
    const removeBadElements = (arr, n) => {
        // To count -1
        let bad_count = 0;
 
        // Traversing from right to left
        for (let i = n - 1; i >= 0; i--) {
 
            // If -1 occurs increment
            // bad count
            if (arr[i] == -1) {
                bad_count++;
 
                // Initialize to -10 for
                // printing purpose
                arr[i] = -10;
            }
 
            // If element is not -1 but bad_
            // count on right is more
            // then also initialize element
            // to -10
            else if (bad_count > 0) {
                arr[i] = -10;
                bad_count--;
            }
        }
 
        for (let i = 0; i < n; i++)
            if (arr[i] != -10) {
                document.write(`${arr[i]} `);
            }
    }
 
    // Driver code
 
    let arr = [1, 2, 3, -1, -1, 4, 5, 6, -1, 0];
    let N = arr.length;
 
    // Function call
    removeBadElements(arr, N);
 
// This code is contributed by rakeshsahni
 
</script>


Output

1 4 5 0 

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


My Personal Notes arrow_drop_up
Related Articles

Start Your Coding Journey Now!