美文网首页
CCF最大的矩形(JAVA)

CCF最大的矩形(JAVA)

作者: 巨鹿lx | 来源:发表于2020-04-03 10:01 被阅读0次

    这道题也是牛客网上的面试题,如果联想不到单调栈,就只能暴力做(数据范围1000 最多计算1000^2次 应该也能过,但我没试)。而使用了单调栈就可以优化成O(n)的复杂度

    单调栈模板

    求每一个数左边第一个比他小的数

    public class Main{
        static int N = 100010,t = -1;
        static int a[] = new int[N];
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            for(int i = 0 ; i < n ; i ++) {
                int x = scanner.nextInt();
                while(t!=-1&&a[t]>=x) t--;
                System.out.print((t==-1?t:a[t])+" ");
                a[++t] = x;
            }
        }
    }
    

    最大的矩形

    public class Main{
        static int N = 1010,t = -1,max,l;
        static int a[] = new int[N];
        static int s[] = new int[N];//用来存储每一个矩形的高度
        static int p[] = new int[N];//用来存储每一个矩形的下标
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            for(int i = 1; i <= n ; i ++) a[i] = scanner.nextInt();
            for(int i = 1 ; i <= n ; i++) {
                while(t!=-1&&s[t]>=a[i]) {
                    l = t==0?0:p[t-1];
                    max = Math.max(max, s[t]*(i-l-1));
                    t--;
                }
                s[++t] = a[i];p[t] = i;
            }
            while(t!=-1) {
                l = t==0?0:p[t-1];
                max = Math.max(max, s[t]*(n-l));
                t--;
            }
            System.out.println(max);
        }
    }
    

    相关文章

      网友评论

          本文标题:CCF最大的矩形(JAVA)

          本文链接:https://www.haomeiwen.com/subject/czicphtx.html