牛客网---2016---美团最大差值

来源:互联网 发布:mac all fired up试色 编辑:程序博客网 时间:2024/05/21 19:50

就这样,愉快的兔子又决定开始坚持做面试题了,这次能坚持多久我也不知道,希望能坚持到毕业,但愿如此,虽然说兔子的决定没有哪一次能坚持到最后的。


这里写图片描述

题目:
有一个长为n的数组A,求满足0≤a≤b< n的A[b]-A[a]的最大值。给定数组A及它的大小n,请返回最大差值。
输入:
[10,5],2
输出:
0
解析:
题目最简单的想法就是用后置位减去前置位,利用双循环进行比较。
代码:

import java.util.*;public class LongestDistance {    public int getDis(int[] A, int n) {        // write code here        // 简单来讲这个题目已知数组和数组大小,那么直接定义一个最大差值进行for循环遍历即可        int max=0;        int temp;        for(int i=0;i<n;i++){            for(int j=i;j<n;j++){                temp=A[j]-A[i];                if(temp>max){                    max=temp;                }            }        }        return max;    }}

贪心:
这道题中的关键词是贪心,贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择,上诉方法的时间复杂度为O(n2)

解析:
上诉方法求解时采用双层for循环,后置位减去前置位求解,实际上,我们可以只使用一次for循环,只要添加一个if语句就可以极大地减少时间复杂度,我们采用后置位减去前置位的最小值来求解,因为后置位减去前置位永远小于等于后置位减去前置位最小解,此时时间复杂度为O(n)
代码:

import java.util.*;public class LongestDistance {    public int getDis(int[] A, int n) {        // write code here        int max=0;        if(n>1){            int min=A[0];            for(int i=1;i<n;i++){                if(A[i]-min>max){                    max=A[i]-min;                }                //这里新添加一个规则,后置位只减去前置位最小的值,那么得到的永远为最小的,这样就算贪心了吧                if(min>A[i]){                    min=A[i];                }            }        }        return max;    }}

这位大大的方法,感激不尽,临表涕零,不知所言