解题思路
寻找数组的中的最小值,则包含最小值的序列的最大乘积值为data[start]*data[end]*min。
最终的最大值分两种情况
- 包含min,即上面所列的表达式
- 不包含min,即最大值在[start,min角标-1] 和[start,min角标+1]这两段中
进行递归调用寻找最终的最大值。
import java.util.Scanner;
public class Main {
private static int findMax(int[] data, int start, int end) {
if (start > end)
return -1;
if (start == end)
return data[start] * data[start];
int min = Integer.MAX_VALUE;
int minIndex = 0;
for (int i = start; i <= end; i++) {
if (data[i] < min) {
min = data[i];
minIndex = i;
}
}
return Math.max(data[start] * data[end] * min,
Math.max(findMax(data, start, minIndex - 1), findMax(data, minIndex + 1, end)));
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] data = new int[n];
for (int i = 0; i < n; i++) {
data[i] = sc.nextInt();
}
System.out.println(findMax(data, 0, data.length - 1));
}
}