
本来是想用单调栈来实现,但我写了好几遍也没把这个逻辑写通,这个是按层来寻找最大值,具体的看代码
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;
}
}