给定整数数组arr [] ,任务是在执行以下操作后在数组中查找剩余元素:
- 在每一回合中,从数组中选择两个最大整数X和Y。
- 如果X == Y,则从数组中删除两个元素。
- 如果X!= Y,则将等于abs(X – Y)的元素插入数组。
注意:如果没有剩余元素,则打印0。
例子:
Input: arr[] = [3, 4, 6, 2, 7, 1]
Output: 1
Explanation:
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: 1
Explanation:
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.
方法:
为了解决上述问题,我们需要使用堆数据结构。之所以使用堆,是因为我们仅需要每个瞬间的当前最大元素,而无需关注其余元素。
- 从给定数组的元素创建一个最大堆。
- 对于每次迭代,请继续提取两次顶层元素。如果它们的绝对差不为零,则将它们的差推回到队列中。
- 继续直到只有一个或没有元素剩余。
- 如果没有剩余元素,则打印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)