Subtraction in the Array
Given an integer k and an array arr[], the task is to repeat the following operation exactly k times:
Find the minimum non-zero element in the array, print it and then subtract this number from all the non-zero elements of the array. If all the elements of the array are < 0, just print 0.
Examples:
Input: arr[] = {3, 6, 4, 2}, k = 5
Output: 2 1 1 2 0k = 1; Pick 2 and update arr[] = {1, 4, 2, 0}
k = 2; Pick 1, arr[] = {0, 3, 1, 0}
k = 3; Pick 1, arr[] = {0, 2, 0, 0}
k = 4; Pick 2, arr[] = {0, 0, 0, 0}
k = 5; Nothing to pick so print 0Input: arr[] = {1, 2}, k = 3
Output: 1 1 0
Approach: Sort the array and take an extra variable named sum which will store previous element which became 0.
Taking arr[] = {3, 6, 4, 2} and initially sum = 0 after sorting the array, it becomes arr[] = {2, 3, 4, 6}.
Now sum = 0, and we print first nonzero element i.e. 2 and assign sum = 2.
In the next iteration, pick second element i.e. 3 and print 3 – sum i.e. 1 as 2 has already been subtracted from all the other non-zero elements. Repeat these steps exactly k times.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; #define ll long long int // Function to perform the given operation on arr[] void operations( int arr[], int n, int k) { sort(arr, arr + n); ll i = 0, sum = 0; while (k--) { // Skip elements which are 0 while (i < n && arr[i] - sum == 0) i++; // Pick smallest non-zero element if (i < n && arr[i] - sum > 0) { cout << arr[i] - sum << " " ; sum = arr[i]; } // If all the elements of arr[] are 0 else cout << 0 << endl; } } // Driver code int main() { int k = 5; int arr[] = { 3, 6, 4, 2 }; int n = sizeof (arr) / sizeof (arr[0]); operations(arr, n, k); return 0; } |
Java
// Java implementation of the approach import java.util.*; class GFG { // Function to perform the given operation on arr[] static void operations( int arr[], int n, int k) { Arrays.sort(arr); int i = 0 , sum = 0 ; while (k-- > 0 ) { // Skip elements which are 0 while (i < n && arr[i] - sum == 0 ) i++; // Pick smallest non-zero element if (i < n && arr[i] - sum > 0 ) { System.out.print(arr[i] - sum + " " ); sum = arr[i]; } // If all the elements of arr[] are 0 else System.out.println( "0" ); } } // Driver code public static void main(String args[]) { int k = 5 ; int arr[] = { 3 , 6 , 4 , 2 }; int n = arr.length; operations(arr, n, k); } } // This code is contributed by Princi Singh |
Python3
# Python implementation of the approach # Function to perform the given operation on arr[] def operations(arr, n, k): arr.sort(); i = 0 ; sum = 0 ; while (k > 0 ): # Skip elements which are 0 while (i < n and arr[i] - sum = = 0 ): i + = 1 ; # Pick smallest non-zero element if (i < n and arr[i] - sum > 0 ): print (arr[i] - sum , end = " " ); sum = arr[i]; # If all the elements of arr[] are 0 else : print ( 0 ); k - = 1 ; # Driver code k = 5 ; arr = [ 3 , 6 , 4 , 2 ]; n = len (arr); operations(arr, n, k); # This code is contributed by PrinciRaj1992 |
C#
// C# implementation of the approach using System; class GFG { // Function to perform the given operation on arr[] static void operations( int []arr, int n, int k) { Array.Sort(arr); int i = 0, sum = 0; while (k-- > 0) { // Skip elements which are 0 while (i < n && arr[i] - sum == 0) i++; // Pick smallest non-zero element if (i < n && arr[i] - sum > 0) { Console.Write(arr[i] - sum + " " ); sum = arr[i]; } // If all the elements of arr[] are 0 else Console.WriteLine( "0" ); } } // Driver code public static void Main(String []args) { int k = 5; int []arr = { 3, 6, 4, 2 }; int n = arr.Length; operations(arr, n, k); } } // This code has been contributed by 29AjayKumar |
Javascript
<script> // JavaScript program implementation of the approach // Function to perform the given operation on arr[] function operations(arr, n, k) { arr.sort(); let i = 0, sum = 0; while (k-- > 0) { // Skip elements which are 0 while (i < n && arr[i] - sum == 0) i++; // Pick smallest non-zero element if (i < n && arr[i] - sum > 0) { document.write(arr[i] - sum + " " ); sum = arr[i]; } // If all the elements of arr[] are 0 else document.write( "0" ); } } // Driver code let k = 5; let arr = [ 3, 6, 4, 2 ]; let n = arr.length; operations(arr, n, k); </script> |
2 1 1 2 0
Time Complexity: O(nlog(n)+n*k)
Auxiliary Space: O(1)
Please Login to comment...