题目:
给定一个长度为N(N>1)的整形数组arr,可以划分成左右两个部分,做部分为arr[0..k],右部分为arr[k+1..N-1],k可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分的最大值的绝对值中,最大的是多少?
例如:[2,7,3,1,1]当左边部分为[2,7],右部分为[3,1,1]时,左部分中最大值减去右部分最大值的绝对值为4,当左部分为[2,7,3],右部分为[1,1]时,左部分中的最大值减去右部分最大值的绝对值为6,还有很多划分方案,但是最终返回6.
思路:确实很多划分,暴力方法也很简单,我相信我不用讲,大家都知道暴力方法(遍历出每种组合,O(n2))怎么做,但是这个是个脑筋急转弯,并不需要暴力,我们抛开表面看本质,两个问题:第一个,左边最大,右边最大,那么整个数组最大肯定出自于这两个之一,那么我们就可以用这最大值减去一个数(这个数还要是找出左边或右边最小的最大值)就是最终的答案,第二个问题(找出左边或右边最小的最大值),左边最大,必定跑不出第一个数,当从一个数向后扩时,当出现了比他大的,则大的就是左边最大值,这是我们不希望得到的,要是比第一个小,则第一个还是左边最大值,则我们左边取第一个数,右边最大,同理,取最后一个数,则最终就是整个数组最大值,减去左边右边较小的最大值
public static int maxABS3(int[] arr) {
int max = Integer.MIN_VALUE;
for (int i = 0; i < arr.length; i++) {
max = Math.max(arr[i], max);
}
return max - Math.min(arr[0], arr[arr.length - 1]);
}