csp 最大的矩形 (双指针,java)

在这里插入图片描述
在这里插入图片描述

    找到最大的矩形,这个矩形的决定因素是最低的高,主要的思路就是将每一个数组元素作为高,得到以这个数组元素作为高的最大面积,然后找到面积的最大值。
    问题来了,如何找到以这个元素为高的最大面积呢?就以问题描述中的5为例,我们要找到5左右两边离5最近的比5小的位置,左边就是1,右边就是2,然后以5为高的面积最大值就是(2的下标-1的下标-1)*5。
    然后问题又来了,为什么是要找两边离5最近的比5小的值呢?因为由这两个小的值确定的矩形里面的高要么是等于5要么是大于5,所以这个区间内部就是以5为高的最大的面积。

import java.util.ArrayList;
import java.util.Map;
import java.util.Scanner;


public class Main {
    
    
	public static void main(String[] args) {
    
    
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int[] heights=new int[n];
		for(int i=0;i<n;i++) {
    
    
			heights[i]=sc.nextInt();
		}
		int maxArea = 0;
        for(int i = 0; i < heights.length; i++){
    
    
            //找到左边第一个小于高的位置下标
            //如果left>=0并且left指向的高大于等于选定的这个高,左指针就左移
            int left = i - 1;
            while(left >= 0 && heights[left] >= heights[i]){
    
    
                left--;
            }
            //找到右边第一个小于高的位置下标
            //如果right小于数组长度
            //并且right指向的高大于等于选定的高,右指针就右移
            int right = i + 1;
            while(right < heights.length && heights[right] >= heights[i]){
    
    
                right++;
            }
            //更新面积的最大值
            maxArea = Math.max(maxArea, (right - left - 1) * heights[i]);   
        }
	    System.out.println(maxArea);
	}
}


猜你喜欢

转载自blog.csdn.net/weixin_51656756/article/details/121310821
CSP