给定一个数组arr[][]由表示N 个事务的N 个列表组成,任务是按照它们出现的顺序合并给定的事务列表,这样在任何时间点,已经执行的事务的总和是非消极的。如果发现是否定的,则打印“-1” 。否则,打印合并的交易列表。
例子:
Input: arr[][] = {{100 → 400 → -1000 → -500}, {-300 → 2000 → -500}}
Output: 100 → 400 → -300 → 2000 → -500 → -1000 → -500
Explanation: The sum at every instant of the above list of transactions is given by {100, 500, 200, 2200, 1700, 700, 200}, which has no negative values.
Input: arr[][] = [[100 → 400]]
Output: 100 400
方法:给定的问题可以被可视化为合并K排序链表的变体,其标准是在任何时刻合并的事务列表的总和应该是非负的。
请按照以下步骤解决问题:
- 初始化一个新节点,比如P ,它表示构造的链表的头部。
- 初始化一个优先级队列,比如PQ ,大小为N以实现Max Heap 。
- 将前N 个交易作为节点插入PQ 。
- 迭代直到PQ不为空并执行以下步骤:
- 弹出优先级队列的顶部节点并将该节点插入到列表的末尾,头部为P 。
- 如果弹出节点的下一个节点存在,则在PQ 中插入弹出节点的下一个节点。
- 完成上述步骤后,打印形成的头为P的链表。
以下是上述方法的实现:-
Java
// Java program for the above approach
import java.util.*;
// Structure of a Node
// in the Linked List
class Node {
int val;
Node next;
// Constructor
Node(int val)
{
this.val = val;
this.next = null;
}
}
class GFG {
// Function to merge the Bank sheets
public static void mergeSheets(
Node lists[])
{
// Initialize Max_Heap
PriorityQueue pq
= new PriorityQueue<>(
new Comparator() {
// Comparator Function
// to make it maxHeap
public int compare(Node a, Node b)
{
return b.val - a.val;
}
});
// Stores the output list
Node p, head = new Node(0);
p = head;
// Insert the first element
// of each list
for (int i = 0;
i < lists.length; i++) {
// If the list is not NULL
if (lists[i] != null) {
// Insert element in
// the priority queue
pq.add(lists[i]);
}
}
// Iterate until PQ is non-empty
while (!pq.isEmpty()) {
p.next = pq.poll();
p = p.next;
if (p.next != null)
pq.add(p.next);
}
p = head.next;
// Print the output list
while (p.next != null) {
System.out.print(p.val + " ");
p = p.next;
}
System.out.print(p.val);
}
// Driver Code
public static void main(String[] args)
{
int N = 2;
Node arr[] = new Node[N];
arr[0] = new Node(100);
arr[0].next = new Node(400);
arr[0].next.next = new Node(-1000);
arr[0].next.next.next = new Node(-500);
arr[1] = new Node(-300);
arr[1].next = new Node(2000);
arr[1].next.next = new Node(-500);
// Function Call
mergeSheets(arr);
}
}
输出:
100 400 -300 2000 -500 -1000 -500
时间复杂度: O(N * log K)
辅助空间: O(K)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。