力扣第84题柱状图中最大的矩形

📅 2026-03-22 📂 2026年归档

本来是想用单调栈来实现,但我写了好几遍也没把这个逻辑写通,这个是按层来寻找最大值,具体的看代码

class Solution {
   public int largestRectangleArea(int[] heights) {
        //第一个存的是值,第二个存的是值对应的索引
        HashMap<Integer,Set<Integer>> map=new HashMap<>();
        //返回的数
        int size=0;
        //存断开的点
        TreeSet<Integer> disconnectSet = new TreeSet<>();
        //这个存都有那些层
        TreeSet<Integer> set=new TreeSet<>();
        for (int i = 0; i < heights.length; i++) {
            Set<Integer> hashSet=map.get(heights[i])==null?new HashSet<>():map.get(heights[i]);
            hashSet.add(i);
            map.put(heights[i],hashSet);
            set.add(heights[i]);
        }
        for (Integer integer : set) {
            //这个是看都有哪些索引是这个层数的
            Integer left=null;
            Integer right=null;
            for (Integer i : map.get(integer)) {
                if(left!=null&&right!=null&&i<=right&&i>=left){
                    disconnectSet.add(i);
                    continue;
                }
                left=disconnectSet.floor(i);
                right=disconnectSet.ceiling(i);
                left=left==null?0:left+1;
                right=right==null?heights.length-1:right-1;

                int max=(right-left+1)*integer;
                size=Math.max(max,size);
                disconnectSet.add(i);
            }
        }
        return size;
    }
}
🏠 返回首页 · 查看完整交互体验