【转】从两个排序数列中找到两个数列组合起来中间大的数

题目:已经两个已经排好序的数组,找出两个数组合起来的中间大的数字。要求算法复杂度尽可能低。如: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]));

}

转载于:https://www.cnblogs.com/cyttina/archive/2012/10/27/2742940.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值