合并K个升序数组

给你一个二维数组(有K行),每一行都已经按升序排列。
请你将所有行合并到一个升序数组中,返回合并后的数组。

本题是LeetCode 合并K个升序链表的变形

采用小顶堆存放每一行的第一个元素,每一行的下标index会依次往后移动。这里直接使用C++ STL 的priority_queue来实现小顶堆。

#include<iostream>
#include<vector>
#include<queue>

using namespace std;

struct Node {
	int val;
	int i;
	int j;
	bool operator < (const Node& a) const {
		return this->val > a.val;
	}
};

vector<int> mergeKSortedVector(vector<vector<int> >& inputs) {
	int m = inputs.size(), n = inputs[0].size();
	if (m <= 1) return inputs[0];
	priority_queue<Node> que;
	for (int i = 0; i < m; i++) {
		que.push({inputs[i][0], i, 0});
	}
	vector<int> ret;
	while (!que.empty()) {
		Node top = que.top();
		que.pop();
		ret.push_back(top.val);
		if (top.j + 1 < n) que.push({inputs[top.i][top.j + 1], top.i, top.j + 1});
	}
	return ret;
}

int main() {
	vector<vector<int> > inputs = {{1,3,5},{2,4,6},{7,11,29}};

	vector<int> ret = mergeKSortedVector(inputs);

	cout << ret.size() << endl;
	for (auto num : ret) {
		cout << num << " ";
	}
	return 0;
}

合并两个升序数组时,可以使用双指针法来实现。具体步骤如下: 1. 创建一个新的数组,用于存储合并后的结果。 2. 初始化两个指针,分别指向两个数组的起始位置。 3. 比较两个指针所指向的元素,将较小的元素添加到新数组中,并将对应指针向后移动一位。 4. 重复步骤3,直到其中一个数组的元素全部添加到新数组中。 5. 将剩余未添加的数组元素依次添加到新数组中。 6. 返回合并后的新数组。 下面是一个示例的C语言函数实现: ```c #include <stdio.h> void mergeArrays(int arr1[], int size1, int arr2[], int size2, int merged[]) { int i = 0, j = 0, k = 0; while (i < size1 && j < size2) { if (arr1[i] < arr2[j]) { merged[k++] = arr1[i++]; } else { merged[k++] = arr2[j++]; } } while (i < size1) { merged[k++] = arr1[i++]; } while (j < size2) { merged[k++] = arr2[j++]; } } int main() { int arr1[] = {1, 3, 5, 7}; int size1 = sizeof(arr1) / sizeof(arr1[0]); int arr2[] = {2, 4, 6, 8}; int size2 = sizeof(arr2) / sizeof(arr2[0]); int merged[size1 + size2]; mergeArrays(arr1, size1, arr2, size2, merged); printf("Merged array: "); for (int i = 0; i < size1 + size2; i++) { printf("%d ", merged[i]); } return 0; } ``` 这个函数接受两个升序数组和它们的大小作为参数,然后将合并后的结果存储在一个新的数组中。在主函数中,我们定义了两个升序数组,并调用了mergeArrays函数进行合并。最后,打印出合并后的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值