对的最大计数,使得每个索引 i 处的元素包含在 i 对中
给定一个数组 arr[] 和一个整数N ,任务是找到可以形成的最大对数,使得i th索引几乎包含在arr[i]对中。
例子:
Input: arr[] = {2, 2, 3, 4}
Output:
5
1 3
2 4
2 4
3 4
3 4
Explanation: For the given array, a maximum of 5 pairs can be created where 1st index is included in 1 pair, 2nd index in 2 pairs, 3rd index in 3 pairs and 4th index in 4 pairs as shown above.
Input: arr[] = {8, 2, 0, 1, 1}
Output:
4
1 2
1 5
1 4
1 2
方法:给定的问题可以使用贪心方法来解决。可以看出,每一步的最优选择是 选择具有最大值的元素并创建它们各自的对。使用此观察结果,请按照以下步骤解决此问题:
- 创建一个最大优先级队列,它按照各自数组值的降序存储给定数组的索引。
- 创建一个循环来迭代优先级队列,直到其中有两个以上的元素,然后按照以下步骤操作:
- 选择优先级队列中的前两个索引,将它们的对附加到答案数组中。
- 如果它们的值大于 0,则在递减各自的数组值后将它们重新插入优先级队列。
- 打印答案数组中的所有对。
下面是上述方法的实现:
Java
// Java implementation of above approach
import java.io.*;
import java.util.*;
class GFG {
public static void maxPairs(int arr[])
{
// Stores the final list
// of pairs required
List matchList = new ArrayList<>();
// Max Priority Queue to
// store induced in order
// of their array value
PriorityQueue pq = new PriorityQueue<>(
(x, y) -> arr[y] - arr[x]);
// Loop to iterate arr[]
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 0)
pq.add(i);
}
// Loop to iterate pq
// till it has more
// than 2 elements
while (pq.size() >= 2) {
// Stores the maximum
int top = pq.poll();
// Stores the second
// maximum
int cur = pq.poll();
// Insert pair into the
// final list
matchList.add(top + 1);
matchList.add(cur + 1);
arr[top]--;
arr[cur]--;
if (arr[top] > 0)
pq.add(top);
if (arr[cur] > 0)
pq.add(cur);
}
// Print Answer
System.out.println(matchList.size() / 2);
for (int i = 0; i < matchList.size(); i += 2) {
System.out.println(matchList.get(i) + " "
+ matchList.get(i + 1));
}
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 1, 2, 3, 4 };
maxPairs(arr);
}
}
输出
5
4 3
4 3
2 4
3 4
2 1
时间复杂度: O(M*log M),其中 M 表示所有数组元素的总和
辅助空间: O(N)