题目:已经两个已经排好序的数组,找出两个数组合起来的中间大的数字。要求算法复杂度尽可能低。如:x数组:1,7,9,10,30 y数组:3,5,8,11 则中间大数为:8
这个题目看似简单,不过要处理起来还是有很多小细节需要注意的。主要思想就是用两个指针同时遍历两个数字,如果第一个数组的值比第二个的小,就第一个数组向前走,否则第二个数组向前走。如果两个的下标等于中间的下标了,那么输出,如果一个数组遍历完成了,还没有到达中间的下标,则说明中间值在另个数组中,标号为 中间下标减去走完的数组元素总数。
代码如下:
#include "stdafx.h" #include <iostream> #include <deque> using namespace std; int GetMaxValue(int a[], int m, int b[], int n) { int maxValue = a[0]; int i = 0, j = 0; int midIndex = (m+n)/2; while(i < m && j < n) { if((i+j) == midIndex) return maxValue; if(a[i] > b[j]) { maxValue = a[i]; j++; } else { maxValue = b[j]; i++; } } if(i == m) { maxValue = b[midIndex - m]; } else { maxValue = a[midIndex - n]; } return maxValue; } int main() { int a[] = {1,3,5,7,9}; int b[] = {2,500,700,900,1000,2000,3000}; cout<<GetMaxValue(a,sizeof(a)/sizeof(a[0]),b,sizeof(b)/sizeof(b[0])); }