在两个有序数组中寻找第k个元素
来源:互联网 发布:黄金分割线软件 编辑:程序博客网 时间:2024/05/17 02:32
这个问题很经典,有必要好好梳理一下:
函数的参数设定为,数组A,A的长度m,数组B,B的长度n,需要找的k。
- 如果m + n < k,那么无论如何也找不到满足要求的数了;
- 如果m和n其一为0,那么就应该返回另一个数组的k - 1位置的元素;
- 否则,将A(近似地)平均分为两部分,记其分点下标为i = m / 2,B也如此做,其分点下标为j = n / 2。假设A[i] <= B[j],如果不是这样,那么就将A、B互换,i、j,m、n也需要互换。
在A中,A[i]之后一共有m - i - 1个元素,B[j]及其之后共有n - j个元素。又由于A[i] <= B[j],合并后,A[i]之后(不包括A[i])将至少有m - i - 1 + n - j = (m + n) - (i + j + 1)个元素。这说明,合并后A[i]之前(包括A[i])至多有i + j + 1个元素。如果k > i + j + 1,那么我们要找的元素不可能在A[i]之前,A[i]及其之前的所有元素可以被舍弃。
综上便可以得到代码:
class FindKthIn2Arrays {private:int findKthIn2Arrays(int A[], int m, int B[], int n, int k) {if (m + n < k)return -1;if (m == 0)return B[k - 1];if (n == 0)return A[k - 1];int *p, *q, i, j, t;i = m / 2;j = n / 2;if (A[i] <= B[j]) {p = A;q = B;}else {p = B;q = A;swap(i, j);swap(m, n);}t = i + j + 1;if (k <= t)return findKthIn2Arrays(p, m, q, j, k);elsereturn findKthIn2Arrays(p + i + 1, m - (i + 1), q, n, k - (i + 1));}public:void tester() {int A[5], B[5];for (int i = 0; i < 5; ++i) {A[i] = 2 * i;B[i] = 2 * i + 1;}cout << findKthIn2Arrays(A, 5, B, 5, 2) << endl;}};
0 0
- 在两个有序数组中寻找第k个元素
- 两个有序数组中,寻找第K大的数
- 两个有序数组合并找第k个元素
- 两个有序数组中的第K个元素
- 【leetcode】——从两个有序数组中寻找他们并集的第k小元素
- 从两个有序数组的并集中寻找第k小元素
- 从两个有序数组的并集中寻找第k小元素
- [LeetCode题解]从两个有序数组的并集中寻找第k小元素
- leetcode之数组类之数组的旋转与分治类-----OJ 189/33/81/153/154 数组旋转 旋转数组搜索 88 有序数组合并 4 两个有序数组寻找第K个元素/中位数 35 寻找插入位置
- 两个有序数组,求有序合并以后的第K个元素
- 关于在一个序列中寻找中位数和第K大的数(在两个等长有序数组中寻找中位数)
- 寻找两个有序数组中的第K个数或者中位数
- 两个有序数组,寻找第k小的数
- 寻找两个有序数组中的第K个数或者中位数
- 寻找两个有序数组的第k小的数
- 寻找数组中第k小元素
- 数组试题---两个有序数组中第K大的元素
- 在两个排序数组中查找第k小元素
- 英语对IT从业者的影响
- html5上传图片
- AJAX核心对象XMLHttpRequest
- 深入理解软件包的配置、编译与安装
- WPF 播放声音的三种方法
- 在两个有序数组中寻找第k个元素
- VS2010ActiveX环境,3个Radios button选其一,并判断选中了哪一个
- random随机函数
- ClassPathXmlApplicationContext类的简单使用
- LINUX 看门狗
- awk正则表达式的与或非
- 2014读书清单
- nvl函数
- eclipse