左右最值最大差

题目来源:牛客网上面的牛课堂系列算法讲座  http://www.nowcoder.com/courses/6/2/3

 

给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0..K],右部分A[K+1..N-1],K可以取值的范围是[0,N-2]。

求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?

给定整数数组A和数组的大小n,请返回题目所求的答案。

 

测试样例:

[2,7,3,1,1],5

返回:6

 1 class  MaxGap {
 2 public:
 3     int  findMaxGap(vector<int>  A, int  n) {
 4         int  m = -1;
 5         for(int  i = 0; i < n ;i++){
 6             if(m < A[i])
 7                 m = A[i];
 8         }
 9         return  max((m-A[0]),(m-A[n-1]));
10     }
11 };

分析:假设全局最大值m在左边,那我们就希望右边的最大值越小越好。随着右边那个区间的左端点左移,右边的最大值不会变小,反倒是有可能变大,所以右边那个区间左端点越靠右越好。同理:最大值m划分到右边也类似,要求左边区间的右端点越靠左越好。所以,前n-1个元素的最大值m和A[0]或A[n-1]的差必然有一个是解。

代码和分析都是网友的贡献,这里仅作笔记。

原文地址:https://www.cnblogs.com/huashanqingzhu/p/5413922.html