给定一个长度为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
给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0..K],右部分A[K+1..N-1],K可以取值的范围是[O,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?
import java.util.*;
public class MaxGap {
public int findMaxGap(int[] A, int n) {
// write code here
int max = A[0];
for(int i=1; i<A.length; i++){
if(max < A[i]){
max = A[i];
}
}
int min = A[0]>A[n-1]?A[n-1]:A[0];
return max - min;
}
} import java.util.*;
public class MaxGap {
public int findMaxGap(int[] A, int n) {
int k =n-2;
int MAX = 0;
for (int i = 0; i <= k ; i++) {
int[] num1 = new int[i+1];
int[] num2 = new int[n-(i+1)];
for (int j = 0; j < num1.length ; j++) {
num1[j] = A[j];
}
Arrays.sort(num1);
int maxLeft = num1[num1.length-1];
int p =i+1;
for (int m = 0; m < num2.length ; m++) {
num2[m] = A[p];
p++;
}
Arrays.sort(num2);
int maxRight = num2[num2.length-1];
if(MAX < Math.abs(maxLeft-maxRight)){
MAX = Math.abs(maxLeft-maxRight);
}
}
return MAX;
}
} import java.util.*;
public class MaxGap {
public int findMaxGap(int[] A, int n) {
int max0 = A[0];
int[] b = new int[n];
b[n - 1] = A[n - 1];
for (int i = n - 2; i >= 0; i--) {
b[i] = A[i] > b[i + 1] ? A[i] : b[i + 1];
}
int maxGap = 0;
for (int k = 0; k < n - 1; k++) {
if(A[k]>max0) max0=A[k];
int gap = Math.abs(max0 - b[k + 1]);
if(gap>maxGap) maxGap=gap;
}
return maxGap;
}
}
import java.util.*;
public class MaxGap {
public int findMaxGap(int[] A, int n) {
// write code here
int mmax = -1;
for(int k = 0 ; k < n -1 ; k ++){
int maxLeft = -1;
int maxRight = -1;
for(int i = 0 ; i < n ; i ++){
if(i <= k){
maxLeft = Math.max(maxLeft,A[i]);
}else {
maxRight = Math.max(maxRight,A[i]);
}
}
mmax = Math.max(Math.abs(maxLeft-maxRight),mmax);
}
return mmax;
}
}
import java.util.*;
public class MaxGap {
public int findMaxGap(int[] A, int n) {
// write code here
//从左边只有A[0]开始
int lmax = A[0];
int rmax = Integer.MIN_VALUE;
int gap = 0;
for(int i=0;i<A.length-1;i++){//循环次数
//left-->A[0]~A[i],right-->A[i+1]~A[n-1]
lmax = Math.max(lmax,A[i]);
for(int j=i+1;j<A.length;j++){
rmax = A[j];
rmax = Math.max(rmax,A[j]);
}
gap = Math.max(gap,Math.abs(lmax-rmax));
}
return gap;
}
}
为何不能完全通过?
方法二:
import java.util.*;
public class MaxGap {
public int findMaxGap(int[] A, int n) {
/*
本题用循环来做结果没有完全作对,后来想了一下,本题无非就是两种情况:
(1)左侧所有数组中最大值的最大值 - 右侧所有数组中的最大值的最小值(左越长越好,又越短越好)
(2)左侧所有数组中最大值的最小值 - 右侧所有数组中的最大值的最大值(左越短越好,又越长越好)
最后取(1)(2)中的最大的、
对于(1):left--> A[0]~A[n-2], right-->A[n-1]
对于(2):left--> A[0], righ-->A[1]~A[n-1]
*/
int max = A[0];
for(int i=0;i<A.length;i++){
if(max<A[i]){max=A[i];}
}
return max-Math.min(A[0],A[n-1]);
}
}
最原始的办法,分别找到左边与右边的最大值,相减取绝对值。
不过本题的说法不严谨。。。有点歧义
public int findMaxGap(int[] A, int n)
{
int maxDisOfTwoGroup = Integer.MIN_VALUE;
for(int k = 0; k <(n-1);k++)
{
int maxNumberOfLeft = A[0];
for(int i = 0; i <= k ; i++)
{
if(A[i] > maxNumberOfLeft)
maxNumberOfLeft = A[i];
}
int maxNumberOfRight = A[k+1];
for(int i = (k+1); i < n ;i++)
{
if(A[i] > maxNumberOfRight)
maxNumberOfRight = A[i];
}
if((maxNumberOfLeft-maxNumberOfRight)
> maxDisOfTwoGroup)
{
maxDisOfTwoGroup =
Math.abs(maxNumberOfLeft-maxNumberOfRight);
}
}
System.out.println(maxDisOfTwoGroup);
return maxDisOfTwoGroup;
}
import java.util.*;
public class MaxGap {
public int findMaxGap(int[] A, int n) {
int max = 0;
for (int i = 0; i < n - 1; i ++ ) {
int max1 = max(A, 0, i);
int max2 = max(A, i + 1, n - 1);
int temp = Math.abs(max1 - max2);
max = max > temp ? max : temp;
}
return max;
}
public static int max(int[] A, int start, int end) {
int res = 0;
for (int i = start; i <= end; i ++ )
res= res > A[i] ? res : A[i];
return res;
}
}
import java.util.*;
public class MaxGap {
public int findMaxGap(int[] A, int n) {
// write code here
int max = 0;
for(int i = 0;i<n;i++){
if(A[i] > max){
max = A[i];
}
}
int min = Math.min(A[0],A[n-1]);
return Math.abs(max - min);
}
}
//简单说一下,不用开辟额外的空间,直接在本数组操作即可
//用三个指针就可以。一个指向K,其余两个以K为分界线,分别指向开头和K+1的位置
public int findMaxGap(int[] A, int n) {
//leftmax存放左边数组的最大值,rightmax存放右边数组的最大值
//value存放差值,temp存放每次的最大值
int leftmax = 0 , rightmax = 0 ,value = 0 , temp = 0;
//以K为分界线,K每次不断移动指针
for(int K = 0 ; K < n-1 ; K++){
//做一个判断。如果是第一次从左到K找最大数
//就进入for循环,如果不是第一次找最大数,
//因为前面已经在K-1个数中找到了最大数,所以不用从新开始找
//只需要和第K个数比较一下就可以了
if (value != 0 && A[K] > leftmax) {
leftmax = A[K];
} else {
leftmax = A[0];
// i每次从0开始遍历到K的位置,并且返回最大值
for (int i = 0; i <= K; i++) {
leftmax = A[i] > leftmax ? A[i] : leftmax;
}
}
rightmax = A[K+1];
//j从K+1处开始遍历,并且返回数组最大值
for(int j = K+1 ;j<n ; j++){
rightmax = A[j]>rightmax?A[j]:rightmax;
}
//记录差值
value = leftmax - rightmax;
//差值小于0,取绝对值
value = value<0?-value:value;
//如果当前差值比上次差值大,替换差值
temp = value>temp?value:temp;
}
//返回差值
return temp;
}