最大差值----美团2016研发工程师在线编程题

[编程题] 最大差值

有一个长为n的数组A,求满足0≤a≤b<n的A[b]-A[a]的最大值。

给定数组A及它的大小n,请返回最大差值。

测试样例:
[10,5],2
返回:0
第一种方法:最先想到的是暴力破解,能够通过测试用例

class LongestDistance {
public:
    int getDis(vector<int> vec, int n) {
        // write code here
        if ( vec.empty() == true ) return 0 ;
        
        int result = 0 ;
        for ( int i = 0; i < vec.size(); ++ i ) {
            for ( int j = i + 1; j < vec.size(); ++ j ) {
                if ( vec[j] - vec[i] > result ) result = vec[j] - vec[i] ;
            }
        }
        if ( result < 0 ) result = 0 ;
        return result ;
    }
};

第二种方法,要找到最大差值,把思路往前推,我们应该找到最小数值,于是利用一个变量来存储最小数值

class LongestDistance {
public:
    int getDis(vector<int> vec, int n) {
        // write code here
        if ( vec.empty() == true ) return 0 ;
        
        int min_value = vec[0] ; // 维护一个最小值
        int result = 0 ;
        for ( int i = 1; i < vec.size(); ++ i ) {
            if ( min_value > vec[i] ) min_value = vec[i] ;
            if ( result < vec[i] - min_value ) result = vec[i] - min_value ;
        }
        
        return result ;
    }
};

第二次做:

class LongestDistance {
public:
    int getDis(vector<int> vec, int n) {
        // write code here
        if ( vec.empty() == true ) return 0 ;
        
        int minv = vec[0] ;
        int maxv = 0 ;
        for ( int i = 1; i < vec.size(); ++ i ) {
            if ( vec[i] - minv > maxv ) maxv = vec[i] - minv ;
            if ( vec[i] < minv ) minv = vec[i] ;
        }
        
        return maxv ;
    }
};


第三次做:

class LongestDistance {
public:
    int getDis(vector<int> vec, int n) {
        // write code here
        int max = 0 ;
        for ( int i = 0; i < vec.size(); ++ i ) {
            int tmp = getmax( vec, i + 1, vec.size() - 1 ) - getmin( vec, 0, i ) ;
            if ( tmp > max ) {
                max = tmp ;
            }
        }
        if ( max < 0 ) return 0 ;
        else return max ;
    }
private:
    int getmax( vector<int>& vec, int left, int right ) {
        int result = 0 ;
        for ( int i = left; i <= right; ++ i ) {
            if ( result < vec[i] ) result = vec[i] ;
        }
        return result ;
    }
    int getmin( vector<int>& vec, int left, int right ) {
        int result = 999999;
        for ( int i = left; i <= right; ++ i ) {
            if ( result > vec[i] ) result = vec[i] ;
        }
        return result ;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值