下面的步骤应是 O(n^2) 的, TLE 超时了
import java.util.ArrayList;
import java.util.List;
public class Solution {
public class Pair{
int sum;
int height;
Pair(int a,int b){
sum = a;height=b;
}
}
public int largestRectangleArea(int[] heights) {
int len = heights.length;
if(len==0) return 0;
List<Pair> pre = new ArrayList<Pair>();
Pair pair = new Pair(heights[0],heights[0]);
pre.add(pair);
int res = heights[0];
for(int i=1;i<len;i++){
List<Pair> cur = new ArrayList<Pair>();
int cur_h = heights[i];
boolean cur_max = true;
int cur_sum;
for(Pair pr:pre){
if(pr.height>cur_h){
cur_max = false;
cur_sum = (pr.sum/pr.height+1)*cur_h;
if(cur_sum>res) res = cur_sum;
Pair cur_pr = new Pair(cur_sum, cur_h);
cur.add(cur_pr);
}else{
cur_sum = pr.sum + pr.height;
if(cur_sum>res) res = cur_sum;
Pair cur_pr = new Pair(cur_sum, pr.height);
cur.add(cur_pr);
}
}
if(cur_max){
cur_sum = cur_h;
if(cur_sum>res) res = cur_sum;
Pair cur_pr = new Pair(cur_sum,cur_h);
cur.add(cur_pr);
}
pre.clear();
pre.addAll(cur);
}
return res;
}
}
答案中这是O(n) 的方法,之所以是O(n) 可以这样想,之多遍历两遍。
思想就是针对每一个柱来如果以其为最小,可以形成多大的面积,然后逐一比较。
中间对 stack的出栈的循环实在是太UGLY了。
public class Solution {
public int largestRectangleArea(int[] height) {
int len = height.length;
int maxsum = 0;
Stack<Integer> s = new Stack<Integer>();
for(int i=0;i<=len;i++){
int h = (i==len)?0:height[i];
if(s.isEmpty()||(h>=height[s.peek()])){
s.push(i);
}else{
int tp = s.pop();
int sum = height[tp]*(s.isEmpty()?i:i-s.peek()-1);
maxsum = (sum>maxsum)?sum:maxsum;
i--;
}
}
return maxsum;
}
}
7663

被折叠的 条评论
为什么被折叠?



