1 条题解

  • 0
    @ 2025-11-30 16:27:50

    C++ :

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define MAXN 400000
    #define LL long long
    int h[400010];
    int n;
    int Queue[400010];
    int L[400010],R[400010];
    int main()
    {
    	cin>>n;
    	int i;
    	for (i=1;i<=n;i++) cin>>h[i];
    	h[0]=h[n+1]=-1;
    	Queue[0]=0;
    	int Head=0,Tail=1;
    	for (i=1;i<=n;i++) {
    		while (Head<Tail && h[i]<=h[Queue[Tail-1]]) Tail--;
    		L[i]=i-Queue[Tail-1]-1;
    		Queue[Tail++]=i;
    	}
    	Queue[0]=n+1;
    	Head=0,Tail=1;
    	for (i=n;i>=1;i--) {
    		while (Head<Tail && h[i]<=h[Queue[Tail-1]]) Tail--;
    		R[i]=Queue[Tail-1]-i-1;
    		Queue[Tail++]=i;
    	}
    	long long MaxArea=0;
    	for (i=1;i<=n;i++) {
    		long long Area=(L[i]+R[i]+1)*h[i];
    		if (Area>MaxArea) MaxArea=Area;
    	}
    	cout<<MaxArea<<endl;
    	return 0;
    }
    

    Java :

    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Main test = new Main();
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) arr[i] = sc.nextInt();
            System.out.println(test.largestArea(arr));
        }
    
        public int largestArea(int[] height){
            if(height == null || height.length == 0) return 0;
            return largestArea(height, height.length);
        }
    
        private int largestArea(int[] height, int n) {
            int[]left = new int[n];
            int[]right = new int[n];
            left[0] = 0;
            right[n-1] = n-1;
    
            for (int i = 1; i < n; i++) {
                // 找到最左边的比它大的元素
                int last = i;
                while (last >= 1 && height[i] <= height[last-1]) last = left[last-1];
                left[i] = last;
            }
    
            for (int i = n-2; i >= 0; i--) {
                // 找到最右边的比它大的元素
                int last = i;
                while (last < n - 1 && height[i] <= height[last+1]) last = right[last+1];
                right[i] = last;
            }
    
            int ans = 0;
            for (int i = 0; i < n; i++) ans = Math.max(ans,(right[i]-left[i]+1)*height[i]);
    
            return ans;
        }
    
    }
    
    • 1

    信息

    ID
    1413
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者