# Reduce the array to atmost one element by the given operations

Given an array of integers **arr[]**, the task is to find the remaining element in the array after performing the following operations:

- In each turn, choose the two maximum integers X and Y from the array.
- If X == Y, remove both elements from the array.
- If X != Y, insert an element into the array equal to
**abs(X – Y)**.

**Note:** If no element remains, print 0. **Examples:**

Input:arr[] = [3, 4, 6, 2, 7, 1]Output:1Explanation:

Elements 7 and 6 are reduced to 1 so the array converts to [3, 4, 2, 1, 1]

Elements 3 and 4 are reduced to 2 so the array converts to [2, 1, 1, 1]

Elements 2 and 1 are reduced to 1 so the array converts to [1, 1, 1]

Element 1 is completely destroyed by another 1 so array is [1] at the end.Input:arr[] = [1, 2, 3, 4, 5]Output:1Explanation:

Elements 4 and 5 are reduced to 1 so the array converts to [1, 2, 3, 1]

Elements 2 and 3 are reduced to 1 so the array converts to [1, 1, 1]

Element 1 is completely destroyed by another 1 so array is [1] at the end.

**Approach:**

To solve the problem mentioned above, we need to use Heap Data Structure. Heaps are used because we only require the current maximum element for every instant and are not concerned about the rest of the elements.

- Create a Max Heap from the elements of the given array.
- Keep extracting the
**top**element twice for every iteration. If their absolute difference is non-zero,**push**their difference back to the queue. - Continue until only one or no elements are remaining.
- If no elements remain, print 0. Otherwise, print the remaining element.

Below is the implementation of above approach:

## C++

`// C++ Program to reduce the` `// array to almost one element` `// by the given operations` `#include <bits/stdc++.h>` `using` `namespace` `std;` `// Function to find the remaining` `// element of array` `int` `reduceArray(vector<` `int` `>& arr)` `{` ` ` `priority_queue<` `int` `> p;` ` ` `// Build a priority queue` ` ` `// using the array` ` ` `for` `(` `int` `i = 0; i < arr.size(); ++i)` ` ` `p.push(arr[i]);` ` ` `// Continue until the priority` ` ` `// queue has one or no elements` ` ` `// remaining` ` ` `while` `(p.size() > 1) {` ` ` `// Top-most integer from heap` ` ` `int` `y = p.top();` ` ` `p.pop();` ` ` `// Second integer from heap` ` ` `int` `x = p.top();` ` ` `p.pop();` ` ` `// Resultant value` ` ` `int` `val = y - x;` ` ` `if` `(val != 0)` ` ` `p.push(val);` ` ` `}` ` ` `// Return 0 if no elements are left` ` ` `if` `(p.size() == 0)` ` ` `return` `0;` ` ` `// Return top value of the heap` ` ` `return` `p.top();` `}` `// Driver code` `int` `main()` `{` ` ` `vector<` `int` `> arr` ` ` `= { 3, 4, 6, 2, 7, 1 };` ` ` `cout << reduceArray(arr)` ` ` `<< ` `"\n"` `;` ` ` `return` `0;` `}` |

## Java

`// Java program to reduce the` `// array to almost one element` `// by the given operations` `import` `java.util.*;` `class` `GFG{` `// Function to find the remaining` `// element of array` `static` `int` `reduceArray(` `int` `[] arr)` `{` ` ` `PriorityQueue<Integer> p = ` `new` `PriorityQueue<>(` ` ` `11` `, Collections.reverseOrder());` ` ` `// Build a priority queue` ` ` `// using the array` ` ` `for` `(` `int` `i = ` `0` `; i < arr.length; ++i)` ` ` `p.add(arr[i]);` ` ` ` ` `// Continue until the priority` ` ` `// queue has one or no elements` ` ` `// remaining` ` ` `while` `(p.size() > ` `1` `)` ` ` `{` ` ` `// Top-most integer from heap` ` ` `int` `y = p.poll();` ` ` `// Second integer from heap` ` ` `int` `x = p.poll();` ` ` ` ` `// Resultant value` ` ` `int` `val = y - x;` ` ` `if` `(val != ` `0` `)` ` ` `p.add(val);` ` ` `}` ` ` ` ` `// Return 0 if no elements are left` ` ` `if` `(p.size() == ` `0` `)` ` ` `return` `0` `;` ` ` `// Return top value of the heap` ` ` `return` `p.poll();` `}` `// Driver code` `public` `static` `void` `main(String[] args)` `{` ` ` `int` `arr[] = { ` `3` `, ` `4` `, ` `6` `, ` `2` `, ` `7` `, ` `1` `};` ` ` ` ` `System.out.println(reduceArray(arr));` `}` `}` `// This code is contributed by jrishabh99` |

## Python3

`# Python3 program to reduce the` `# array to almost one element` `# by the given operations` `# Function to find the remaining` `# element of array` `def` `reduceArray(arr):` ` ` ` ` `p ` `=` `[]` ` ` `# Build a priority queue` ` ` `# using the array` ` ` `for` `i ` `in` `range` `(` `len` `(arr)):` ` ` `p.append(arr[i])` ` ` `p.sort(reverse ` `=` `True` `)` ` ` `# Continue until the priority` ` ` `# queue has one or no elements` ` ` `# remaining` ` ` `while` `(` `len` `(p) > ` `1` `):` ` ` ` ` `# Top-most integer from heap` ` ` `y ` `=` `p[` `0` `]` ` ` `p ` `=` `p[` `1` `:]` ` ` `# Second integer from heap` ` ` `x ` `=` `p[` `0` `]` ` ` `p ` `=` `p[` `1` `:]` ` ` `# Resultant value` ` ` `val ` `=` `y ` `-` `x` ` ` ` ` `if` `(val !` `=` `0` `):` ` ` `p.append(val)` ` ` `p.sort(reverse ` `=` `True` `)` ` ` `# Return 0 if no elements are left` ` ` `if` `(` `len` `(p) ` `=` `=` `0` `):` ` ` `return` `0` ` ` `# Return top value of the heap` ` ` `return` `p[` `0` `]` `# Driver code` `if` `__name__ ` `=` `=` `'__main__'` `:` ` ` ` ` `arr ` `=` `[ ` `3` `, ` `4` `, ` `6` `, ` `2` `, ` `7` `, ` `1` `]` ` ` ` ` `print` `(reduceArray(arr))` `# This code is contributed by Surendra_Gangwar` |

**Output:**

1

**Time Complexity:**O(NlogN)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**

In case you wish to attend **live classes **with experts, please refer **DSA Live Classes for Working Professionals **and **Competitive Programming Live for Students**.