📌  相关文章
📜  通过给定的操作将数组减少到至少一个元素

📅  最后修改于: 2021-05-14 00:32:50             🧑  作者: Mango

给定整数数组arr [] ,任务是在执行以下操作后在数组中查找剩余元素:

  • 在每一回合中,从数组中选择两个最大整数X和Y。
  • 如果X == Y,则从数组中删除两个元素。
  • 如果X!= Y,则将等于abs(X – Y)的元素插入数组。

注意:如果没有剩余元素,则打印0。
例子:

方法:
为了解决上述问题,我们需要使用堆数据结构。之所以使用堆,是因为我们仅需要每个瞬间的当前最大元素,而无需关注其余元素。

  • 从给定数组的元素创建一个最大堆。
  • 对于每次迭代,请继续提取两次顶层元素。如果它们的绝对差不为零,则将它们的差回到队列中。
  • 继续直到只有一个或没有元素剩余。
  • 如果没有剩余元素,则打印0。否则,打印剩余元素。

下面是上述方法的实现:

C++
// C++ Program to reduce the
// array to almost one element
// by the given operations
  
#include 
using namespace std;
  
// Function to find the remaining
// element of array
int reduceArray(vector& arr)
{
    priority_queue 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 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 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


输出:
1

时间复杂度: O(N)