区间最大值
题目:给定一个数组 求出截取出来的和和当前最小值的乘积结果的最大值
直接上答案:
/**
* 当前最小值 设每个值为当前最小值
* 前缀求和数组
* 通过栈的大小比较进出,可以确认到当前最小值的最远下标,也就是最大求和
* 升级版:顺序可以打乱
* @param args
*/
public static void main(String[] args) {
int[] number = new int[]{6,5,2,18,19};
Stack<Integer> stack = new Stack<>();
System.out.println(getMax(number));
}
public static int getMax(int[] numbers) {
if(numbers==null||numbers.length==0){
return 0;
}
Stack<Integer> stack = new Stack<>();
int[] sum = new int[numbers.length+1];
int max = 0;
for (int i = 1; i <= numbers.length; i++) {
sum[i] = sum[i - 1] + numbers[i - 1];
}
for(int i = 0;i< numbers.length;i++){
while (!stack.isEmpty() && numbers[i] < numbers[stack.peek()]){
int index = stack.pop();
int left = i;
int right = i;
if(stack.isEmpty()){
left = 0;
}else {
left = index;
}
max = Math.max(max,numbers[index]*(sum[right]-sum[left]));
}
stack.push(i);
}
while (!stack.isEmpty()){
int index = stack.pop();
int left = numbers.length;
int right = numbers.length;
if(stack.isEmpty()){
left = 0;
}else {
left =index;
}
max = Math.max(max,numbers[index]*(sum[right]-sum[left]));
}
return max;
}

浙公网安备 33010602011771号