2013年08月06日

查找差值最大的两个数


题目

在待字闺中看到陈利人老师发的这个题,自己写了一下。题目是: > 给定无序数组A,在线性时间内找到i 和 j, j > i,并且保证A[j] - A[i]是最大的。

解答

这个问题比较简单,看到后第一反应是最大连续和子数组问题的变种,算出每相邻两个数之间的差值,然后寻找最大连续和子数组,下面是代码。

#include<iostream>
#include<climits>

using namespace std;

void print(int *array, int len){
    if(array == NULL || len <= 0)
        return;
    int i;
    for(i = 0; i < len; i++)
        cout << array[i] << " ";
    cout << endl;
}

void findTheTwoNum(int *array, int len, int& start, int& end){
    if(array == NULL || len <= 0)
        return;
    int i = 0;
    int max = 0, maxsofar = 0;
    for(i = 1; i < len; i++){
        if(maxsofar + array[i] - array[i-1] > 0)
            maxsofar += array[i] - array[i-1];
        else{
            maxsofar = 0;
            start = i;
        }
        if(maxsofar > max){
            max = maxsofar;
            end = i;
        }
    }
}

void findTheTwoNumV2(int *array, int len, int& start, int& end){
    if(array == NULL || len <= 0)
        return;
    int max = 0,min = INT_MIN;
    int i;
    for(i = 0; i < len; i++){
        if(array[i] < min){
            min = array[i];
            start = i;
        }else{
            if(array[i] - min > max){
                max = array[i] - min;
                end = i;
            }
        } 
    }
}

int main(){
    int array[] = {3,7,8,5,9,2,10};
    //int array[] = {3,7,8,5,1,2,10};
    int len = sizeof(array) / sizeof(int); 
    int start = 0,end = 0;
    print(array,len);
    findTheTwoNum(array,len,start,end);
    cout << "start:array[" << start << "] = " << array[start] << endl;
    cout << "end: array[" << end << "] = " << array[end] << endl;
    return 0;
}

后面看到网友的回复,还有更加简单的思路,遍历一遍,保持A[0]-A[j-1]中最小的数min,计算A[j] - min,更新最大差值,代码在上面给出了。

前一篇: Cap理论和nwr策略 后一篇: Openstack Dashboard定制介绍