📌  相关文章
📜  对的最大计数,使得每个索引 i 处的元素包含在 i 对中

📅  最后修改于: 2022-05-13 01:56:07.161000             🧑  作者: Mango

对的最大计数,使得每个索引 i 处的元素包含在 i 对中

给定一个数组 arr[] 和一个整数N ,任务是找到可以形成的最大对数,使得i th索引几乎包含在arr[i]对中。

例子:

方法:给定的问题可以使用贪心方法来解决。可以看出,每一步的最优选择是 选择具有最大值的元素并创建它们各自的对。使用此观察结果,请按照以下步骤解决此问题:  

  • 创建一个最大优先级队列,它按照各自数组值的降序存储给定数组的索引。
  • 创建一个循环来迭代优先级队列,直到其中有两个以上的元素,然后按照以下步骤操作:
    • 选择优先级队列中的前两个索引,将它们的对附加到答案数组中。
    • 如果它们的值大于 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)