题目内容:
给定一个长度为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
我的思路:写一个getMax方法,将数组和起始终止位置传进去,分别对0-K,K+1到N-1调用,外层对K进行循环
MyCode:
1 public int findMaxGap(int[] A, int n) { 2 int result = 0; 3 for (int i = 0; i < n - 1; i++) { 4 int tmp = Math.abs(getMax(A,0,i) - getMax(A,i+1,n-1)); 5 result = tmp > result ? tmp : result; 6 } 7 return result; 8 } 9 int getMax(int[] A, int start, int end) { 10 int max = A[end]; 11 for (int i = start; i < end; i++) { 12 if (A[i] > max) { 13 max = A[i]; 14 } 15 } 16 return max; 17 }
算法复杂度: O(N2)
编码期间错误:
无。
emm。。。应该有更好的方法。。。
答案思路:
这个K的移动情况会有两种极端的情况,【第一种】:A[0]与后面所有;【第二种】:A[n-1]与前面所有。
而其他的任何情况都一定会比他们俩的最大的那一个小,为什么?
以第一种举例,假设现在k右移,变成了A[0]A[1]与后面所有,那么左边部分的最大值就可能会变大,右边部分的最大值就可能变小,从而最后的差值变小,以此类推。所以此题的解只会在这两种情况里面产生。
答案代码:
1 public int findMaxGap(int[] A, int n) { 2 int max = A[0]; 3 for (int i = 1; i < n; i++) { 4 max = A[i] > max ? A[i] : max; 5 } 6 return A[0] > A[n-1] ? max - A[n-1] : max - A[0]; 7 }
答案复杂度:O(N)
结论:看题目的时候不要着急开始动手,要先动脑想想题目的意思,然后进行分析看看能不能把一个复杂的问题利用题目中已给的信息进行简化,这就是动态规划的思想和精髓!