有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列。对于1<=i,j<=k,求k个最小的(ai+bj)。要求算法尽量高效。
2017-01-13 13:29
786 查看
有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列。对于1<=i,j<=k,求k个最小的(ai+bj)。要求算法尽量高效。
int *min_k(int *A, int *B, int len1, int len2, int k) { if (A == NULL || B == NULL || k <= 0) return NULL; int i, j; int *tmp = new int[k]; i = len1; j = len2; while (i > 0 && j > 0) { //当前情况是否满足条件 //移动哪一个数组的元素 if (A[i - 1] >= B[j - 1]) { //是否可移动 if ((i - 1) * j >= k) i--; else break; } else { if ((j - 1) * i >= k) j--; else break; } } int count = 0; //A[i-1]>B[i-1],则先计算B元素的和,避免A[i-1]算入 if (A[i - 1] > B[j - 1]) { int p, q; for (p = 0; p < i; p++) { for (q = 0; q < j; q++) { if (count < k) { cout << "A:" << A[p] << " B: " << B[q] << " "; tmp[count++] = A[p] + B[q]; } else break; } } } else { int p, q; for (p = 0; p < j; p++) { for (q = 0; q < i; q++) { if (count < k) { cout << "B:" << B[p] << " A: " << A[q] << " "; tmp[count++] = B[p] + A[q]; } else break; } } } return tmp; }
相关文章推荐
- Domain,project,user,role,token 的概念理解
- 使用keychain增删改查数据。
- 机器学习-斯坦福课程系列1【基本概念】
- Authentication Failed For RDS backend
- String contains 和 split 遇到的细节问题
- 人工智能的冷思考
- Socket,NIO,AIO基本概念(一)
- Region和Available Zone的区别
- HDU5877Weak Pair
- LINK1123:failure during conversion to COFF:file invalid or corrupt
- Paint 的set方法
- maven打jar包(结合了dubbo)的main方法启动
- c:if 通过${fn:contains(id,'')多条件判断
- 172. Factorial Trailing Zeroes
- 从subdirectory到subdomain的悲惨教训
- 219. Contains Duplicate II
- 比特币Bitcoin 工作证明机制POW宣告失败
- 373. Find K Pairs with Smallest Sums**
- CHAPTER1 INTRODUCTION -- Deep Learning Book Reading notes
- 关于scrollview使用报错Exception raised during rendering: ScrollView can host only one direct child (Detail