给定一个整数数组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(NlogN)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。